我有这张桌子
----------------
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。问题是我总是得到错误的结果。
答案 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
一个更简单的解决方案只有在有一个组时才有效,如果你希望总组明智,那么必须在查询中做一些更改
select a.id, a.duration , @tot:=@tot+a.duration as tot
from
tbl a
join
(select @tot:=0)tmp
| ID | DURATION | TOT |
-----------------------
| 1 | 10 | 10 |
| 2 | 50 | 60 |
| 3 | 30 | 90 |