sql-server - 如何选择符合特定条件的最新行
问题描述
我有越来越多的 id、一个项目编号和一个状态代码的行。随着时间的推移,可以为同一项目添加新条目,直到添加状态为 0 的条目。99% 的项目将只有一个状态条目,即 0。
我想获取具有最新状态的行,但仅限于未达到状态 0 的项目。我觉得我可能在这里遗漏了一些简单的解决方案。
我可以使用如下子查询:
Select ... From (
Select max(id), item, status
From updates
Group by item
Having status <> 0
) Where not exists (select 1 from updates u2 where u2.item = updates.item and u2.status=0)
排除状态不是 0,但在某个时刻达到 0 的项目。但这似乎效率很低。
我也可以在外部 SELECT 中删除having
并过滤掉status=0
,但绝大多数项目只有状态 0 条目,所以这也不是很有效。
由于我只需要浏览表一次,因此游标解决方案可能很有效,但如果可能的话,我想坚持使用简单的查询。
我还缺少哪些其他选择?
解决方案
您可以在此处使用窗口函数来计算最新行以及是否status=0
每Item
.
目前还不清楚你所说的“最新”是什么意思,我用过,ORDER BY u.Id DESC
但你可能想要其他一些排序。
SELECT id, item, status
FROM (
SELECT *,
isStatus0 = COUNT(CASE WHEN u.status = 0 THEN 1 END) OVER (PARTITION BY u.Item),
rn = ROW_NUMBER() OVER (PARTITION BY u.Item ORDER BY u.Id DESC)
FROM updates u
) u
WHERE u.rn = 1 AND u.isStatus0 = 0;
推荐阅读
- visual-studio - 通过 docker-compose 调试停止工作
- javascript - 在 redux 中,他们是否可以为使用相同的 React JS Web 应用程序打开的单独选项卡提供单独的商店?
- python - 如何使用基于日期列的预测
- php - 获取作者在空间分类中的帖子
- apache - .htaccess 将查询字符串重写为路径 url
- android - 房间数据库不更新值
- build - 工艺,关于建设 Kdenlive
- javascript - Lodash 用条件合并两个数组
- python - 简单的列表程序不起作用 - 列表索引超出范围错误
- python - 未知标签类型:“连续”sklearn LogisticRegression