2014-10-10 62 views
0

一列中的最大值的所有行我有一個這樣的表:如何選擇,使用SQL

+----+---------+---------------------+ 
| id | user_id |  start_date  | 
+----+---------+---------------------+ 
| 1 |  1 | 2014-02-01 00:00:00 | 
| 2 |  1 | 2014-01-01 00:00:00 | 
| 3 |  2 | 2014-01-01 00:00:00 | 
| 4 |  2 | 2014-01-01 00:00:00 | 
| 5 |  3 | 2015-01-01 00:00:00 | 
+----+---------+---------------------+ 

我該怎麼選擇,爲每個用戶,都行:

  • 開始日期NOW()和
  • 最大起始日期

所以對於示例行,輸出應該是:

+----+---------+---------------------+ 
| id | user_id |  start_date  | 
+----+---------+---------------------+ 
| 1 |  1 | 2014-02-01 00:00:00 | // this is a single maximum date within that user 
| 3 |  2 | 2014-01-01 00:00:00 | // these two share maximum start date 
| 4 |  2 | 2014-01-01 00:00:00 | 
+----+---------+---------------------+ 

什麼我到目前爲止是這樣的:

SELECT t.* FROM ticket t 
    JOIN (
     SELECT start_date, MAX(start_date) FROM ticket /* GROUP BY user_id */ 
    ) highest 
    ON t.start_date = highest.start_date 
    WHERE t.start_date <= NOW(); 

但可根據需要,這並不工作。我在好路上嗎?

回答

4

你在正確的軌道上,有點。 在你的派生表,你需要得到每個用戶ID的最大日期,所以:

SELECT user_id, 
     MAX(start_date) as MaxDate 
     FROM ticket 
     GROUP BY user_id 

然後你就可以加入到對開始日期和用戶ID:

SELECT t.* FROM ticket t 
    JOIN (
     SELECT user_id, 
     MAX(start_date) as MaxDate 
     FROM ticket 
     GROUP BY user_id 
    ) highest 
    ON t.start_date = highest.maxdate 
    and t.user_id = highest.user_id 
    WHERE t.start_date <= NOW(); 

SQL Fiddle

+0

+1以幾秒鐘擊敗我,得到同樣的答案:) – 2014-10-10 16:11:33

0

_try:

SELECT T.* FROM ticket AS T 
JOIN (SELECT 
    [User_Id] 
    ,MAX([Start_Date]) AS Start_Date 
FROM ticket 
WHERE Start_Date <= GETDATE() 
GROUP BY User_Id) AS Grouped ON T.User_Id = Grouped.User_Id AND T.Start_Date = Grouped.Start_Date 
ORDER BY Id 
DROP TABLE #This