如何返回最早日期的记录?
Posted
技术标签:
【中文标题】如何返回最早日期的记录?【英文标题】:How do I return the record with the earliest date? 【发布时间】:2017-06-12 12:08:54 【问题描述】:我需要返回每个不同学生 ID 的第一条记录。在我的示例代码中,我有一个记录在同一日期有两个事件,而另一个学生在不同日期有多个事件。
我需要选择最早的日期,如果在同一日期发生多个事件,则将最早的事件 ID 作为下一个条件。有什么好方法可以做到这一点?
我在这个数据集中有大约 35 列,但为了简洁起见,只包括下面的前 5 列。
数据:
期望的结果:
示例代码如下。
CREATE TABLE #TEMP (
StudentID float,
SchoolID float,
StudentNameFull nvarchar(255),
IncidentID float,
IncidentDate date
)
INSERT INTO #TEMP (StudentID, SchoolID, StudentNameFull, IncidentID, IncidentDate)
VALUES
(1111111, 406, 'Smith,John', 123321, '20170501'),
(1111111, 406, 'Smith,John', 123322, '20170501'),
(2222222, 406, 'Jones,Tim', 654789, '20170501'),
(2222222, 406, 'Jones,Tim', 659872, '20170503'),
(2222222, 406, 'Jones,Tim', 478978, '20170508')
SELECT * FROM #TEMP
谢谢。
【问题讨论】:
【参考方案1】:在 SQL Server 中,您可以使用 ROW_NUMBER()
:
select t.*
from (select t.*,
row_number() over (partition by StudentId order by IncidentDate, IncidentID) as seqnum
from #TEMP t
) t
where seqnum = 1;
这将“最简单的事件”解释为“具有最小值的incidentId”。
【讨论】:
谢谢@Gordon Linoff,您的意思是“最早的事件”吗? 我更喜欢使用DENSE_RANK
而不是ROW_NUMBER
来做这些事情。如果出现平局,ROW_NUMBER 将只选择一条记录,而 DENSE_RANK 将选择两者(或更多)。即使在这样的情况下,可能不会发生关系,我想知道它们是否确实发生。
谢谢@HoneyBadger,语法会相似吗?只需将 Row_Number 替换为 Dense_Rank?
@JM1,是的,语法和ROW_NUMBER
一样
@HoneyBadger,当我在生产环境中运行 DENSE_RANK 时,它显示我的记录多于 ROW_NUMBER。结果中有重复的学生证。为什么会这样?【参考方案2】:
您可以将 With Ties 子句与 Row_Number()
结合使用 SELECT Top 1 with Ties *
FROM #TEMP
Order By Row_Number() over (Partition By StudentID Order by IncidentDate,IncidentID )
【讨论】:
您也忘记通过IncidentId
订购...仔细检查数据。
@TimBiegeleisen 谢谢你的收获
@ShakeerMirza 不是新的。我只是喜欢这种方法,因为没有额外的字段
@ShakeerMirza 这就是我喜欢 SO 的原因。我每天都学到新东西。这就是有趣的部分
+1 这实际上是天才,出于完全相同的原因,我碰巧讨厌WHERE
-clause 方法,由此产生的额外列。感谢这种令人耳目一新的简单方法!正如你所说,你每天都会学到新东西:)以上是关于如何返回最早日期的记录?的主要内容,如果未能解决你的问题,请参考以下文章