SQL:如何只选择最旧的记录

时间:2019-06-10 20:49:32

标签: sql sql-server

我意识到这是一个先前提出的问题,但是在调查这些帖子时,没有一个适合我的工作。

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

我之前已经解决了这样的问题,然后回去找到了我的旧代码,并尝试将其应用于这种特殊情况。问题在于,那时我正尝试为给定的人获取最多的 recent 记录,但我不确定如何更改此处适用于 oldest < / em>记录。如果一个人访问了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

3 个答案:

答案 0 :(得分:4)

您不应该按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

答案 1 :(得分:1)

我喜欢您的尝试和坎纳科夫斯基先生的解决方案,但这是另一种选择。

SELECT     a.PersonID
         , a.PersonName
         , a.VisitDate
         , a.Status
         , a.VisitType
FROM       VisitInfo AS a
INNER JOIN (
               SELECT PersonID
                    , MIN(VisitDate) AS OldestVisitDate
               FROM   VisitInfo
               WHERE  Status = 'Unchanged'
           )         AS b ON a.PersonID = b.PersonID
                             AND a.VisitDate = b.OldestVisitDate
WHERE      a.Status = 'Unchanged';

答案 2 :(得分:0)

也许尝试:

SELECT DISTINCT
      PersonID,
      PersonName,
      MIN(VisitDate) AS [First visit date],          
      VisitType    
FROM 
    VisitInfo
WHERE 
    Status = 'Unchanged'
GROUP BY
    PersonID,
    PersonName,        
    VisitType 

未经测试!