获取最早日期的sql查询

获取最早日期的sql查询,sql,sql-server,Sql,Sql Server,如果我有一个列为id,name,score,date 我想运行一个sql查询来获取数据集中日期最早的记录,其中id=2 您可以在查询中这样做,还是需要在事实发生后循环 我要获取该记录的所有字段。如果您只需要日期: SELECT MIN(date) as EarliestDate FROM YourTable WHERE id = 2 如果需要所有信息,请执行以下操作: SELECT TOP 1 id, name, score, date FROM YourTable WHERE id = 2

如果我有一个列为
id
name
score
date

我想运行一个sql查询来获取数据集中日期最早的记录,其中
id=2

您可以在查询中这样做,还是需要在事实发生后循环


我要获取该记录的所有字段。

如果您只需要日期:

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
尽可能防止循环。循环通常会导致游标,游标几乎从来都不是必需的,而且通常效率很低。

试试看

SELECT TOP 1 ID, Name, Score, [Date]
FROM myTable
WHERE ID = 2
Order BY [Date]
我已经有一段时间没有使用sql了,所以这可能需要一些调整。

使用“limit”和“top”不能用于所有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)

在使用TOP或sub查询时,我会将问题分解为以下步骤:

查找目标记录

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
虽然使用派生表的此解决方案较长,但它是:

  • 更容易测试
  • 自我记录
  • 可扩展
由于查询的一部分可以独立运行,因此测试更容易

它是自文档化的,因为查询直接反映了需求 ie派生表列出id=2且日期最早的行


它是可扩展的,就像需要另一个条件一样,可以很容易地将其添加到派生表中。

如果我也想获取此记录的名称,该怎么办如果存在具有相同最小日期的行,则可以返回多行。
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