2016-11-17 6 views
2

実行するSqliteに対して複雑なクエリがあります。以下の表を参考にしてください。Sqliteでクエリを実行して、各ユーザーの3つの最新レコードのみをグループ化します。

各ユーザーIDとBatchIDとステータスの合計について、最新のレコードが3つ必要です。また、結果ごとにレコード数をカウントする必要があります。

たとえば、ユーザーID U6TH16003のレコード数が1である場合、レコード数は1になります。ユーザーU6TH15001には7つのレコードがあり、3つの最新レコードのみが考慮され、最新の3レコード

UserID   Sum(Status)  NumberOfRecords 
U6TH16001  1    3 
U6TH16002  3    3 
U6TH16003  1    1 
U6TH15001  2    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 

である私は、上記の表のために必要な出力は以下の通りであるユーザーあなたの助け。

+0

これは残念ながらSQLiteに組み込まれていない何らかの行番号機能を必要とします。 –

+0

私はこれまでのようなものを試しました。:select UserID、SUM(Att_status)from userid)そして、それはすべての記録のために私を返すのですが、3人だけを考慮する方法はありますか? – 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

関連する問題