把這個簡單的查詢:GROUP BY的日期,與日期排序
SELECT DATE_FORMAT(someDate, '%y-%m-%d') as formattedDay
FROM someTable
GROUP BY formatterDay
這將從一個表,每個日期只有1行中選擇行。
如何確保每個日期選擇的行是該日期最早的行,而不在FROM中執行有序的子查詢?
乾杯
把這個簡單的查詢:GROUP BY的日期,與日期排序
SELECT DATE_FORMAT(someDate, '%y-%m-%d') as formattedDay
FROM someTable
GROUP BY formatterDay
這將從一個表,每個日期只有1行中選擇行。
如何確保每個日期選擇的行是該日期最早的行,而不在FROM中執行有序的子查詢?
乾杯
如果您使用的是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。
我會重寫查詢是這樣的:
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
這兩者都不起作用。 第一個將返回同一日期的行(我只希望每個日期有一行,因此分組依次),第二個不能保證選擇每個日期的最早日期。 – 2010-05-14 11:10:22
謝謝。我能夠用一個內部查詢來做到這一點,但是想知道是否有辦法做到這一點。你回答了這個問題。 :) – 2010-05-14 11:18:57
我希望有,我想能夠生成一個密集的列列,然後只是選擇其中的dense_rank是1的行。哦,至少MySql是快速的。乾杯。 – Gennadiy 2010-05-14 11:21:39