【问题标题】:Selecting row with max running total on one column less than a given value在小于给定值的一列上选择具有最大运行总计的行
【发布时间】:2014-01-06 01:33:23
【问题描述】:

例如,对于这样的表:

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 放在外部 select 语句中,而无需在 val 上添加 group by 子句。我无法添加 group by 子句,因为这会改变查询的整个语义。

我找到了类似问题的解决方案 - Fetch the row which has the Max value for a column

这些解决方案大多建议,我们加入同一个表,然后匹配列的值,但是计算 running_total 列并对其进行连接,我必须再次计算它吗?这听起来相当昂贵。

【问题讨论】:

    标签: sql postgresql amazon-redshift


    【解决方案1】:

    你可以这样做。窗口函数来救援。

    只需添加另一层子查询,计算每行的最大运行总数。然后使用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;
    

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 2014-12-01
      • 1970-01-01
      • 2017-12-17
      • 2020-09-09
      • 2021-07-23
      • 2021-08-16
      • 1970-01-01
      • 2013-08-15
      相关资源
      最近更新 更多