SQLite查询 - 按连续序列分组

时间:2016-11-17 22:43:27

标签: android sql sqlite

我正在寻找在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

1 个答案:

答案 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 NumberID中减去它以创建分组并进行数学运算然后匹配。此方法要求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