sql查询获取最早日期

Posted

技术标签:

【中文标题】sql查询获取最早日期【英文标题】:sql query to get earliest date 【发布时间】:2010-03-06 18:16:24 【问题描述】:

如果我有一个包含 idnamescoredate 列的表

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

您可以在查询中执行此操作,还是需要在事后循环?

我想获取该记录的所有字段..

【问题讨论】:

【参考方案1】:

如果你只想要日期:

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

尽可能避免循环。循环通常会导致游标,而游标几乎从不需要,而且通常效率很低。

【讨论】:

如果我也想得到这个记录的名字怎么办【参考方案2】:
SELECT TOP 1 ID, Name, Score, [Date]
FROM myTable
WHERE ID = 2
Order BY [Date]

【讨论】:

【参考方案3】:

虽然使用 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且日期最早的行。

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

【讨论】:

【参考方案4】:

试试

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

我做sql已经有一段时间了,所以这可能需要一些调整。

【讨论】:

【参考方案5】:

使用“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)

【讨论】:

如果有相同的最小日期的行,这可以返回多行。

以上是关于sql查询获取最早日期的主要内容,如果未能解决你的问题,请参考以下文章

sql查询时间最小值的列

SQL Server如何优化获取具有最大值的相关记录的查询

SQL Server 2012 查询混乱

SQL 子查询:如何用 min(date) 和 min(hour) 绘制记录

获取最大日期行的 SQL 查询

SQL查询获取特定日期和列中最新日期之间的数据