首页 > 解决方案 > 如何选择符合特定条件的最新行

问题描述

我有越来越多的 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 条目,所以这也不是很有效。

由于我只需要浏览表一次,因此游标解决方案可能很有效,但如果可能的话,我想坚持使用简单的查询。

我还缺少哪些其他选择?

标签: sql-servertsql

解决方案


您可以在此处使用窗口函数来计算最新行以及是否status=0Item.

目前还不清楚你所说的“最新”是什么意思,我用过,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;

推荐阅读