2013-12-18 24 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; 
相關問題