2013-12-18 29 views
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子句的原因,这会改变查询的整个语义。

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

天色这些解决方案建议,我们一起用相同的表,然后为列值匹配,但计算running_total列,并做就可以了加盟,我必须再次计算它?这听起来相当昂贵。

回答

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; 
相关问题