sql - 如何使用按时间和日期排序的唯一递增值更新所有行的列?
问题描述
我在 postgres 数据库中有一个要维护的队列,我需要根据条目进入队列的时间(时间和日期)来跟踪它们的位置,现在在我的应用程序中的某个时间点,我需要从中删除一个或多个条目数据库,在这种情况下,我需要根据它们加入的时间重新对齐条目的位置,例如,这是我的表结构 现在假设我们删除位置 1 的条目,在这种情况下,条目的位置与位置值 2 应该分别更新为 1 和 3 到 2,我正在尝试使用 row_number() 按以下方式进行操作
update waitingvisitor upd
set position = a.row_number
FROM (
SELECT "queueId", row_number() over(order by "timeJoined")
from waitingvisitor
ORDER BY "timeJoined"
) as a
where upd."queueId" = a."queueId";
但是所做的一切都很奇怪,我似乎无法理解为什么它会像这样更新所有行
现在我想要的是,根据 timeJoined 字段,“位置”列的值应该相应地更新,例如,最早加入的人应该被赋予更高的优先级。这里出了什么问题?
解决方案
好吧,已经整理好了,我所要做的就是比较主键 id 而不是 here 子句中的 queueId 列,Godamnt,我认为列队列 id 对所有行都带有相同的值。
update waitingvisitor upd
set position = a.row_number
FROM (
SELECT "queueId", row_number() over(order by "timeJoined")
from waitingvisitor
ORDER BY "timeJoined"
) as a
where upd."id" = a."id";
推荐阅读
- reactjs - 延迟更新数组 React 的 setState
- mysql - 在mysql中以相反的顺序将表加入到自身中
- android - Android Room:查询不返回所有包含连接的行
- sql - 寻求改进的 SQL 查询
- proxy - Squid 代理无法访问受 Cloudflare 保护的网站
- c++ - 需要一个参考折叠规则的例子 T&&&& -> T&& on VS2017
- javascript - 将带有许多 && 的长 if 语句转换为带有 javascript 的 for 循环
- python - 通过 Python 将 CSV 文件中的数据批量/插入到 CosmosDB
- python - 上传项目后在 github 上的 django 项目中隐藏密钥
- apache-flink - Flink:在视图中使用 MATCH_RECOGNIZE