我意识到这是一个先前提出的问题,但是在调查这些帖子时,没有一个适合我的工作。
我有一个访问过某个地点的人的名单,其中许多人已经多次访问过。每个人都有一个唯一的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
答案 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
未经测试!