我正在寻找在SQLite上运行的SQL。
我有这个表(3个整数列)和数据(这里是数据的子集)
ID aid adur
1 1 5
2 3 7
3 3 8
4 3 5
5 2 9
6 1 9
7 1 2
我希望得到以下adur结果,其中表格a)从最大ID到最小值排序b)当2个或更多个aids是相同的时候,adurs是相加的。
ID aid adur adur
7 1 2 11
6 1 9
5 2 9 9
4 3 5 20
3 3 8
2 3 7
1 1 5 5
我尝试了以下内容。它没有提供所需的结果,因为它将表格中的所有adurs一次性分组/总和vs grouping / summing只是那些adurs是背靠背(连续)相同。
SELECT Min(act_test.ID) AS MinOfID, act_test.aid, Sum(act_test.adur) AS SumOfadur
FROM act_test
GROUP BY act_test.aid
ORDER BY Min(act_test.ID) DESC
答案 0 :(得分:2)
SELECT t.*, g.SumAdur
FROM
Table t
LEFT JOIN (
SELECT
r.aid
,MIN(r.Id) as MinId
,MAX(r.Id) as MaxId
,SUM(r.adur) as SumAdur
FROM
(
SELECT *
,(SELECT COUNT(*) FROM Table tc
WHERE t.Id >= tc.Id AND t.aid = tc.aid) as RowNum
FROM
Table t
)r
GROUP BY
r.aid
,r.Id - r.RowNum
) g
ON t.Id = g.MaxId
ORDER BY
t.Id DESC
创建一个Partitioned Row Number
从ID
中减去它以创建分组并进行数学运算然后匹配。此方法要求ID
是一个没有间隙的增量数字。如果ID
可能存在差距,那么您只需要在整个表格中创建Row Number
,然后使用它来创建分组。
如果ID
有差距,请使用以下内容:
SELECT t.*, g.SumAdur
FROM
Table t
LEFT JOIN (
SELECT
r.aid
,MIN(r.Id) as MinId
,MAX(r.Id) as MaxId
,SUM(r.adur) as SumAdur
FROM
(
SELECT *
,(SELECT COUNT(*) FROM Table tc
WHERE t.Id >= tc.Id AND t.aid = tc.aid) as AidRowNum
,(SELECT COUNT(*) FROM Table tc
WHERE t.Id >= tc.Id) as IdRowNum
FROM
Table t
)r
GROUP BY
r.aid
,r.IdRowNum - r.AidRowNum
) g
ON t.Id = g.MaxId
ORDER BY
t.Id DESC
如果你想让价值显示在每一行上,只需改变:
ON t.Id = g.MaxId
要
ON t.Id BETWEEN g.MinId AND g.MaxId