0

私のテーブルは次のようになります。

id  | user_id | period_id | completed_on
----------------------------------------
1   | 1       | 1         | 2010-01-01
2   | 2       | 1         | 2010-01-10
3   | 3       | 1         | 2010-01-13
4   | 1       | 2         | 2011-01-01
5   | 2       | 2         | 2011-01-03
6   | 2       | 3         | 2012-01-13
... | ...     | ...       | ...

すべてのユーザーが同じ期間エントリを持っているわけではないことを念頭に置いて、最新のユーザー期間エントリのみを選択したいと思います。

基本的に(私が持っているのは上記の表だけだと仮定して)これを取得したい:

id  | user_id | period_id | completed_on
----------------------------------------
3   | 3       | 1         | 2010-01-13
4   | 1       | 2         | 2011-01-01
6   | 2       | 3         | 2012-01-13

以下のクエリは両方とも、常に最初のuser_idオカレンスが選択された結果であり、最新のものではありません(順序付けは、私が理解しているものから行が選択された後に行われるため)。

SELECT
    DISTINCT user_id,
    period_id,
    completed_on
FROM my_table
ORDER BY
    user_id ASC,
    period_id DESC

SELECT *
FROM my_table
GROUP BY user_id
ORDER BY
    user_id ASC,
    period_id DESC
4

2 に答える 2

2

MAX次のサブクエリを使用すると、次のように機能するようです。

SELECT t.Id, t.User_Id, t.Period_Id, t.Completed_On
FROM my_table t
   JOIN (SELECT Max(completed_on) Max_Completed_On, t.User_Id
         FROM my_table
         GROUP BY t.User_ID
         ) t2 ON
      t.User_Id = t2.User_Id AND t.Completed_On = t2.Max_Completed_On

ただし、completed_onの日付がユーザーごとに同じである複数のレコードが存在する可能性がある場合は、複数のレコードが返される可能性があります。必要に応じて、サブクエリにMAX(Id)を追加し、それに参加することで機能する可能性があります。

于 2013-03-26T18:34:31.650 に答える
0

これを試して:

SELECT t.Id, t.User_Id, t.Period_Id, t.Completed_On
FROM table1 t
JOIN (SELECT Max(completed_on) Max_Completed_On, t.User_Id
FROM table1 t
GROUP BY t.User_ID) t2 ON t.User_Id = t2.User_Id AND t.Completed_On = t2.Max_Completed_On

デモはこちら

于 2013-03-26T18:38:23.527 に答える