2016-11-17 80 views
0

我找SQL对SQLite的运行。SQLite的查询 - 按相邻序列

我有这个表进行排序从最大的ID到最小(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结果,其中表是一个)和b)当两个或两个以上的辅助设备相同时,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进行分组/求和,只是这些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

你需要一个给定的'援助'的所有行的总和? –

+0

谢谢!只有那些连续的行。 (背靠背)。在上面的最后一个表格示例中...所有援助1的预期结果是前11(adur 9 + adur 2,因为这两个1是背靠背的),5是因为这个adur/row是孤立的。援助2也是一样。答案是9,因为只有一种援助2.而对于援助3,有三个背靠背,所以这三个援助者的总和为20. –

+0

可以有多于3个连续的行桌子? –

回答

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 

TO

ON t.Id BETWEEN g.MinId AND g.MaxId 
+0

真棒解决方案!谢谢马特。 SQLite是否支持上述所有语法? –