2

例如,对于如下表:

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

我需要找到 col_a / col_b 的值,其中 col_c 上的运行总计小于给定值。

到目前为止,我有:

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 放在外部 select 语句中,而无需在 val 上添加 group by 子句。我不能添加 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 回答