2010-05-14 254 views
0

把這個簡單的查詢:GROUP BY的日期,與日期排序

SELECT DATE_FORMAT(someDate, '%y-%m-%d') as formattedDay
FROM someTable
GROUP BY formatterDay

這將從一個表,每個日期只有1行中選擇行。
如何確保每個日期選擇的行是該日期最早的行,而不在FROM中執行有序的子查詢?

乾杯

回答

1

如果您使用的是MySQL,您無法在單個選擇中執行您想要的操作。您需要一個內部查詢來爲每個格式化日期選擇最小ID和格式或其他字段。然後再次在父表上加入它並選擇具有最小ID的記錄。

在其他數據庫(postgresql,oracle,db2)中,有一些窗口函數允許在單個select(即DENSE_RANK()OVER ...)中執行此操作。

這裏是具有內部查詢(您可能已經知道的)的示例:

SELECT B.formattedDay, A.* 
    FROM someTable A 
     JOIN 
     (
      SELECT DATE_FORMAT(someDate, '%y-%m-%d') as formattedDay, 
        MIN(ID) as firstId 
      FROM someTable I 
     GROUP BY 1 
     ) B ON (A.ID = B.firstId) 

變化MIN如果需要的話(ID)爲MIN(someDate)及其時間戳。如果多個記錄可能出現相同的時間戳,則需要執行兩次操作。首先獲取每天的最低日期,然後每個最低日期的最低ID。

+0

謝謝。我能夠用一個內部查詢來做到這一點,但是想知道是否有辦法做到這一點。你回答了這個問題。 :) – 2010-05-14 11:18:57

+0

我希望有,我想能夠生成一個密集的列列,然後只是選擇其中的dense_rank是1的行。哦,至少MySql是快速的。乾杯。 – Gennadiy 2010-05-14 11:21:39

0

我會重寫查詢是這樣的:

SELECT distinct DATE_FORMAT(someDate, '%y-%m-%d') as formattedDay 
    FROM someTable 
ORDER BY DATE_FORMAT(someDate, '%y-%m-%d') 

如果完全由(即你正在使用您沒有顯示我們的聚合函數)需要組只是做:

SELECT DATE_FORMAT(someDate, '%y-%m-%d') as formattedDay 
    FROM someTable 
GROUP BY DATE_FORMAT(someDate, '%y-%m-%d') 
ORDER BY DATE_FORMAT(someDate, '%y-%m-%d') -- this is redundant, but you can use another column here 
+0

這兩者都不起作用。 第一個將返回同一日期的行(我只希望每個日期有一行,因此分組依次),第二個不能保證選擇每個日期的最早日期。 – 2010-05-14 11:10:22