2011-05-31 112 views
1

我有以下sqlite3的表:如何在同一時間使用sql進行分組和排序?

Name | LastUpdated | Status 
============================ 
Adam | 2011-05-28 | 1 
Bob | 2011-05-05 | 6 
Adam | 2011-05-27 | 2 
Adam | 2011-05-16 | 1 
Adam | 2011-05-26 | 3 
Bob | 2011-05-18 | 1 
Adam | 2011-05-29 | 6 

,我想每選擇由LASTUPDATED列排序名稱一行。所以我想得到這個數據:我想我必須做一個子查詢,但我不知道如何去解決這個問題。

+0

沒有意義 - 你想要的bob記錄有最早的日期;亞當的是最新的... – 2011-05-31 02:54:36

+0

我只是想通了。 SELECT Name,MAX(LastUpdated),Status FROM [table] GROUP BY名稱 – Rudacles 2011-05-31 03:00:54

+0

這樣做,您將獲得一個任意狀態字段,而不是與MAX(LastUpdated)列對應的字段 - 如果這是您想要的。在你的例子中,你顯示'狀態'字段'鮑勃'爲'1',這是最新更新日期的狀態字段... – 2011-05-31 03:14:17

回答

0
 

SELECT 
     t.Name, 
     (Select LastUpdated from [table] t1 where t.name = t1.name order by lastUpdated desc LIMIT 1) as LastUpdated, 
     (Select Status from [table] where t1.name = t.name order by lastUpdated desc LIMIT 1) as Status 
FROM [table] t 
GROUP by Name 
 
+0

沒有關聯,所以將返回最新狀態和最後更新的所有記錄。爲什麼你會使用子選擇而不是MAX,我不知道... – 2011-05-31 03:03:20

+0

杜...編輯它。我本來可以使用MAX以及......第一本能似乎是被再次選擇:/ – 2011-05-31 03:06:46

3

的SQLite(和MySQL)支持:

SELECT t.name, 
     MAX(t.lastupdated), 
     t.status 
    FROM [table] t 
GROUP BY t.name 

但大多數其他數據庫將需要您使用:

SELECT a.name, a.lastupdate, a.status 
    FROM YOUR_TABLE a 
    JOIN (SELECT t.name, MAX(t.lastupdated) AS max_lastupdated 
      FROM YOUR_TABLE t 
     GROUP BY t.name) b ON b.name = a.name 
         AND b.max_lastupdated = a.lastupdated 

...雖然這將返回重複,如果一個名稱有具有相同最高日期值的多個記錄。

+1

如果他們有不同的地位,但是相同的日期?此外,你不聚合的狀態 - 不會拋出一個錯誤?我認爲這個要求是隻對名稱進行分組,並根據日期選擇最新的一切(或者我理解它)。 – 2011-05-31 03:07:11

+0

@MR:SQLite(和MySQL)選擇一個任意的行 - http:// www .sqlite.org/lang_select.html#resultset - 用於不包含聚合函數或組的依據。它實際上是ANSI標準的一部分。 – 2011-05-31 03:09:23

+0

但你不想那樣,對吧?根據lastUpdatedDate字段,是否也需要選擇最新的「狀態」?因爲對於有'鮑勃'的行,他已經顯示了具有最新日期的狀態字段... – 2011-05-31 03:10:21

1

您可以將其作爲自聯接。在這種情況下,我已經叫表「表」,在替換爲自己的表名:

SELECT 
    test.Name, 
    test.LastUpdated, 
    test.Status 
FROM 
    test INNER JOIN 
    (SELECT 
     Name, 
     MAX(LastUpdated) AS LatestUpdated 
     FROM 
     test 
     GROUP BY 
     Name) AS latest 
    ON test.Name = latest.name AND test.LastUpdated = latest.LatestUpdated; 

希望這有助於!