选择总和大于X的行

3

我有这个表格

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

我希望选择sum(duration)大于15的id。换句话说...
-------------------------
ID    | Duration | Sum
-------------------------
1       10         10
2       10         20
3       10         30

当ID为2的行时,总和会变得更大。我必须精确选择这一行。

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

3个回答

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排序。

0

请查看SQLFiddle以获取备选解决方案。

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

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 |

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接