首页 > 解决方案 > 相同条件下除最新数据外的查询更新

问题描述

我有一个场景来更新相同条件下的行(状态 = 1),但不是最新的行。所以这是桌子设计。

--------------------------------------------------
|idx     | status | var1  |  date
--------------------------------------------------
| 2      |  1     |  cat  | 2018-06-17 15:41:32.110      
| 3      |  1     |  dog  | 2018-06-17 11:41:32.110
| 2      |  1     |  lamb | 2018-06-17 11:41:32.110
| 2      |  1     |  pc   | 2018-06-17 09:41:32.110
| 3      |  1     |  doll | 2018-06-17 09:41:32.110

我想要的是获得 idx 相等且状态 = 1 的所有相同条件,并将状态更新为 0,除了最近的行。在这种情况下,有 3 行的 idx 为 2 且状态 = 1,以及 2 行的 idx 为 3 且状态 = 1。查询后,表应如下所示

--------------------------------------------------
|idx     | status | var1  |  date
--------------------------------------------------
| 2      |  1     |  cat  | 2018-06-17 15:41:32.110      
| 3      |  1     |  dog  | 2018-06-17 11:41:32.110
| 2      |  0     |  lamb | 2018-06-17 11:41:32.110
| 2      |  0     |  pc   | 2018-06-17 09:41:32.110
| 3      |  0     |  doll | 2018-06-17 09:41:32.110

我不知道如何做到这一点,并尝试至少显示具有超过 1 个相等条件的行并提出此查询

select Idx, status, COUNT(Idx) as count from table 
group by Idx, status
having COUNT(Idx) > 1 and status = 1
order by Idx

这显示了我在相同条件下有多少行,但我也希望有行来显示 var1 和 date 但我不知道该怎么做。

当我从事 .Net 开发工作时,我可以将 idx 列表添加到列表中,并在每个 idx 上执行 for 循环并在该 for 循环中进行更新,但我很想了解有关 sql 的更多信息,如何解决这个问题.

标签: sqlsql-server

解决方案


我们可以尝试使用 CTE 进行更新:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY idx ORDER BY date DESC) rn
    FROM yourTable
)

UPDATE cte
SET status = 0
WHERE rn > 1 AND status = 1;

推荐阅读