选择SUM大于X的行

时间:2013-05-21 10:55:11

标签: mysql sql sum having-clause

我有这张桌子

----------------
ID    | Duration 
----------------
1       10       
2       10      
3       10       

我想选择总和(持续时间)大于15的id。换句话说......

-------------------------
ID    | Duration | Sum
-------------------------
1       10         10
2       10         20
3       10         30

Sum在ID为2的行中变得更加重要。我必须准确选择这一行。

当然我不能从存储过程中使用SUM(),所以我必须使用JOIN并且可能使用HAVING而不是WHERE。问题是我总是得到错误的结果。

3 个答案:

答案 0 :(得分:0)

要做到这一点,你需要一个累积总和,MySQL不直接提供。您可以使用子查询来完成此操作。然后选择正确的行。

select id, duration, cumdur
from (select id, duration,
             (select sum(duration)
              from t t2
              where t2.duration < t.duration or
                    (t2.duration = t.duration and t2.id <= t.id)
             ) as cumdur
      from t
     ) t
where 15 between (cumdur - duration + 1) and cumdur

请注意,当多行具有相同的持续时间时,此订单会按id排序。

答案 1 :(得分:0)

检查SQLFiddle是否有备用解决方案。

SELECT 
  id 
FROM 
  test1 
JOIN  
  (SELECT @rn := 0 ) r 
WHERE 
  (@rn := @rn + duration) > 15

答案 2 :(得分:0)

尝试此查询

select a.id, a.duration, sum(b.duration) as tot
from 
tbl a 
inner join
tbl b 
On
a.id>=b.id
group by a.id

将保证正确的持续时间值

select a.id, a.duration, b.tot
from 
tbl a 
inner join 
(select a.id, sum(b.duration) as tot
from 
tbl a 
inner join
tbl b 
On
a.id>=b.id
group by a.id)
b
on a.id=b.id

SQL FIDDLE

一个更简单的解决方案只有在有一个组时才有效,如果你希望总组明智,那么必须在查询中做一些更改

select a.id, a.duration , @tot:=@tot+a.duration as tot
from 
tbl a 
join 
(select @tot:=0)tmp

SQL FIDDLE

| ID | DURATION | TOT |
-----------------------
|  1 |       10 |  10 |
|  2 |       50 |  60 |
|  3 |       30 |  90 |