如何解决添加 PIT ID
我有一个 Postgresql 9.3 查询,如下所示:
select dateSoS,timeSoS
from workSchedules
where timeSoS between '02:00' and '11:00'
group by dateSoS,timeSoS,createdTs
order by dateSoS desc,createdTs desc,timeSoS desc;
它输出大约 10k 条记录,如下所示:
"2021-04-15";"08:00:00"
"2021-04-15";"08:00:00"
"2021-04-15";"08:00:00"
"2021-04-15";"08:00:00"
"2021-04-15";"08:00:00"
"2021-04-15";"07:30:00"
"2021-04-15";"07:30:00"
"2021-04-15";"07:30:00"
"2021-04-14";"07:30:00"
"2021-04-14";"07:30:00"
"2021-04-14";"07:30:00"
"2021-04-14";"07:30:00"
"2021-04-13";"06:30:00" <== not an error
"2021-04-13";"08:00:00"
"2021-04-13";"08:00:00"
"2021-04-13";"08:00:00"
...
其中,workSchedules 有一个名为 PITId(Point in Time Id)的附加字段。我需要的是为 PITId 填充每个日期的唯一 ID。换句话说,使用上面的示例,我希望 dateSoS 为 2021-04-15 的所有记录的 PITId 为 1,2021-04-14 的 dateSoS 的 PITId 为 2,dateSoS 为 2021-04-13将 PITId 设为 3,并且 ...
我尝试编写一些 PHP 来完成这项工作,但它永远运行。
对于 timeSoS 的时间范围,我还有四个范围要运行。我不介意运行四次查询,但一次运行必须添加前一次。
问候,
解决方法
使用dense_rank()
:
select t.*,dense_rank() over (order by dateSos::date desc) as pitid
from t;
在更新中,您可以改为使用:
update t
set pitid = tt.new_pitid
from (select dateSos::date as dateSos,row_number() over (order by dateSos::date) as new_pitid
from t
group by 1
) tt
where tt.dateSos = dateSos::date
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。