2016-11-17 38 views
2

我有一個複雜的查詢來運行Sqlite。請考慮下表。在Sqlite上的查詢只能爲每個用戶分組三個最近的記錄

我將需要三個最近的記錄爲每個用戶ID和BatchID和狀態的總和。我還需要計算每個結果的記錄數。

例如,假設用戶ID U6TH16003只有1條記錄,則記錄數將爲1.用戶U6TH15001有7條記錄,只有3條最近的記錄會被考慮,並且狀態字段會被添加到3條最近的記錄中用戶這給2和審議了狀態字段的總和記錄總數爲3

Date  UserID  Status 
2016-11-14 U6TH16001 0 
2016-11-17 U6TH16001 0 
2016-11-07 U6TH16001 1 
2016-11-01 U6TH16001 0 
2016-10-20 U6TH16002 1 
2016-10-15 U6TH16002 1 
2016-10-10 U6TH16002 1 
2016-11-14 U6TH16003 1 
2016-11-17 U6TH15001 1 
2016-11-14 U6TH15001 0 
2016-11-07 U6TH15001 1 
2016-11-01 U6TH15001 0 
2016-10-28 U6TH15001 1 
2016-10-23 U6TH15001 1 
2016-10-15 U6TH15001 1 

,我需要對上表的輸出是如下:

UserID   Sum(Status)  NumberOfRecords 
U6TH16001  1    3 
U6TH16002  3    3 
U6TH16003  1    1 
U6TH15001  2    3 

謝謝你你的幫助。

+0

這需要某種行號的功能,不幸的是SQLite沒有內置。 –

+0

我已經嘗試過類似這樣的事情了:從用戶組表單中選擇UserID,SUM(Att_status))。它將所有記錄都歸還給我,有沒有辦法只考慮最多的三個? – Lovelesh

+0

您嘗試的問題是「LIMIT」將應用於整個查詢。但是你想要將它應用到每個組。其他RDBMS具有行號功能,可用於保留每組的前3行。在SQLite中,你將不得不以某種方式模擬這種行爲。 –

回答

1

首先,讓所有用戶ID:

SELECT DISTINCT UserID FROM MyTable; 

然後爲每個這樣的用戶ID,確定我們要處理,由日期排序該用戶的記錄,並選擇第三個最小的日期:

SELECT UserID, 
     (SELECT Date 
     FROM MyTable 
     WHERE UserID = Users.UserID 
     ORDER BY Date DESC 
     LIMIT 1 OFFSET 2 
     ) AS MinDate 
FROM (SELECT DISTINCT UserID 
     FROM MyTable 
    ) AS Users; 
 
UserID  MinDate 
U6TH16001 2016-11-07 
U6TH16002 2016-10-10 
U6TH16003 NULL 
U6TH15001 2016-11-07 

然後,我們可以將這些值回與原表中只得到所需的記錄,最後搞得聚集在他們:

SELECT MyTable.UserID, 
     SUM(Status), 
     COUNT(*) 
FROM MyTable 
JOIN (SELECT UserID, 
      (SELECT Date 
       FROM MyTable 
       WHERE UserID = Users.UserID 
       ORDER BY Date DESC 
       LIMIT 1 OFFSET 2 
      ) AS MinDate 
     FROM (SELECT DISTINCT UserID 
      FROM MyTable 
      ) AS Users 
    ) AS MinDates 
    ON MyTable.UserID = MinDates.UserID 
    AND MyTable.Date >= IFNULL(MinDates.MinDate, 0) 
GROUP BY MyTable.UserID; 
+0

這就是我需要的:)完美的工作。非常感謝CL。 – Lovelesh

相關問題