2016-11-17 89 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是否支持上述所有語法? –