首页 > 解决方案 > SQL:如何只选择最旧的记录

问题描述

我意识到这是一个以前被问过的问题,但在调查这些帖子后,没有一个完全适合我正在研究的内容。

我有一个访问过某个位置的人的列表,其中许多人访问过多次。每个人都有一个唯一的 ID,每次访问都有日期和状态(我只查看状态为“未更改”的访问,而不是“已取消”、“重新安排”等)。我需要做的是只为每个人选择最旧的记录。换句话说,只查看他们第一次访问的日期。

我以前解决过这样的问题,然后我回过头来找到我的旧代码并尝试将其应用于这种特殊情况。问题是,那时,我试图为给定的人提取最近的记录,但我不确定如何更改我在这里的内容以应用于最旧的记录。如果一个人访问了 3 次,而另一个人访问了 7 次,我不知道如何处理我的seqnum变量。

此外,如果我按照当前的方式运行此代码,我仍然会为每个人获取多条记录,这完全是另一个问题。至少未更改访问的过滤器正在工作。

有什么想法吗?

SELECT DISTINCT
  PersonID,
  PersonName,
  VisitDate,
  Status,
  VisitType

FROM (SELECT VisitInfo.*,
      ROW_NUMBER() OVER (PARTITION BY PersonID, VisitDate ORDER BY VisitDate DESC) as seqnum
      FROM VisitInfo
      WHERE Status = 'Unchanged'

      ) VisitInfo

WHERE seqnum = 1
ORDER BY VisitDate

标签: sqlsql-server

解决方案


您不应该按 分区VisitDate,因为几乎每一行都有自己的分区。

SELECT 
  PersonID,
  PersonName,
  VisitDate,
  Status,
  VisitType

FROM (SELECT VisitInfo.*,
      ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY VisitDate) as seqnum
      FROM VisitInfo
      WHERE Status = 'Unchanged'

      ) VisitInfo

WHERE seqnum = 1
ORDER BY VisitDate

推荐阅读