2

たとえば、次のようなテーブルの場合:

ID | col_a  | col_b  | col_c
=============================
 1 |5.0     |7.0     |3
 2 |3.0     |6.8     |5

col_c の現在の合計が特定の値よりも小さい col_a / col_b の値を見つける必要があります。

これまでのところ、私は持っています:

select MAX(running_total) as max FROM (select (col_a / col_b) as val, SUM(col_c)
OVER (ORDER BY value ROWS UNBOUNDED PRECEDING) as running_total FROM tableName)
WHERE running_total < 50;

これにより、現在の最大合計が得られますが、この running_total が達成された行の val (col_a/col_b) も必要です。

このクエリには Amazon Redshift を使用しています。これは、mysql とは異なり、val に group by 句を追加せずに、外側の select ステートメントに val を配置できません。クエリのセマンティック全体を変更する group by 句の原因を追加することはできません。

同様の問題の解決策を見つけました-列の最大値を持つ行をフェッチします

ほとんどの場合、これらの解決策は、同じテーブルと結合してから列の値を照合することを示唆していますが、running_total 列が計算され、それを結合するには、もう一度計算する必要がありますか? これはかなり高価に聞こえます。

4

1 に答える 1

2

あなたはこれを行うことができます。ウィンドウ機能が助けになります。

各行の現在の最大合計を計算するサブクエリの別のレイヤーを追加するだけです。次に、where句を使用して一致する行を取得します。

select t.*
from (select t.*,
             max(running_total) over () as maxrt
      FROM (select (col_a / col_b) as val,
                   SUM(col_c) OVER (ORDER BY value ROWS UNBOUNDED PRECEDING
                                   ) as running_total
            FROM tableName
           ) t
      WHERE running_total < 50
     ) t
where running_total = maxrt;
于 2013-12-18T02:21:48.863 に答える