sql - 相同条件下除最新数据外的查询更新
问题描述
我有一个场景来更新相同条件下的行(状态 = 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 的更多信息,如何解决这个问题.
解决方案
我们可以尝试使用 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;
推荐阅读
- javascript - 异步等待不等待
- c++ - C++:如何在运行时以编程方式定义模板类型?
- r - 构建向量的所有组合 - 寻找更好的方法
- java - 编译最新版本的l2switch时出现问题
- ios - Swift NSCoder 不适用于双变量
- java - Java 等价于 C++ 箭头
- sqlite - SQLite如何处理最后带有负号的负数
- javascript - FeatureCollection 中的“crs”是什么意思?
- javascript - firebase 实时数据库,如果用户是对话的一部分,则 child_changed
- ios - iOS:应用 API KEY 限制时 Google Maps API 失败