首页 > 解决方案 > 如何使用按时间和日期排序的唯一递增值更新所有行的列?

问题描述

我在 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 字段,“位置”列的值应该相应地更新,例如,最早加入的人应该被赋予更高的优先级。这里出了什么问题?

标签: sqlpostgresqlqueuewindow-functionsrow-number

解决方案


好吧,已经整理好了,我所要做的就是比较主键 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";

推荐阅读