2016-11-17 39 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

相关问题