sql - 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
解决方案
您不应该按 分区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
推荐阅读
- prolog - 序言中的局部否定
- java - 如何在不改变 Java 中的顺序的情况下找到一组整数的顺序?
- html - 是否可以将规则应用于标签嵌套中的特定标签?
- redux - 在 redux 中观察 redux-saga 动作
- google-bigquery - 使用源谷歌驱动器创建表模式并在 bigquery 表中加载数据
- service - 无法设置服务的优先级
- swift - 如何使用 SwiftUI 的 onDelete() 函数访问数组位置
- python - 用 OpenCV + Python 拼接四个图像
- swift - ScrollView 在关闭 ViewController 并调用 viewDidLoad 时不会重新加载
- python - 从网站抓取价格为零的问题