2010-03-06 942 views
19

,如果我有列ID,姓名,分數,日期SQL查詢來獲取最早日期

一個表,我想運行一個SQL查詢來獲取記錄其中id = 2與數據的最早日期組。

你可以在查詢內做到這一點,或者你需要在事後循環嗎?


編輯:爲了明確,我想獲得該記錄的所有字段。 。

回答

28

如果你只是想日期:

SELECT MIN(date) as EarliestDate 
FROM YourTable 
WHERE id = 2 

如果你希望所有的信息:

SELECT TOP 1 id, name, score, date 
FROM YourTable 
WHERE id = 2 
ORDER BY Date 

防止環路時即可。循環往往導致遊標,而遊標幾乎不是必需的,而且往往效率非常低。

+0

如果我想獲取該記錄的名稱,該怎麼辦 – leora 2010-03-06 18:34:30

5
SELECT TOP 1 ID, Name, Score, [Date] 
FROM myTable 
WHERE ID = 2 
Order BY [Date] 
2

嘗試

select * from dataset 
where id = 2 
order by date limit 1 

已經有一段時間,因爲我做的SQL,所以這可能需要一些調整。

1

使用「限制」和「頂部」不適用於所有SQL服務器(例如使用Oracle)。 您可以在純SQL嘗試更復雜的查詢:

select mt1.id, mt1."name", mt1.score, mt1."date" from mytable mt1 
where mt1.id=2 
and mt1."date"= (select min(mt2."date") from mytable mt2 where mt2.id=2) 
+0

如果有最低日期相同的行,則可以返回多行。 – 2017-08-22 13:05:45

0

在使用TOP或一個子查詢都工作,我將問題分解成以下步驟:

查找目標記錄

SELECT MIN(date) AS date, id 
FROM myTable 
WHERE id = 2 
GROUP BY id 

加入拿到其他領域

SELECT mt.id, mt.name, mt.score, mt.date 
FROM myTable mt 
INNER JOIN 
( 
    SELECT MIN(date) AS date, id 
    FROM myTable 
    WHERE id = 2 
    GROUP BY id 
) x ON x.date = mt.date AND x.id = mt.id 

雖然這種解決方案,使用衍生的表,是較長的,它是:

  • 容易測試
  • 自我記錄
  • 伸縮

這是比較容易,測試爲一體的部件查詢可以獨立運行。

它是自我記錄,因爲查詢直接反映了要求 即,派生表列出了id = 2的行的最早日期。

它是可擴展的,就好像另一個條件是必需的,這可以很容易地添加到派生表。