PostgreSQL:基于以前的值递增select语句中的列值

kxeu7u2r  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(139)

我使用的是Postgresql 13,我有一个类似于下面的表:
| 事件标识|时间戳记|
| - -|- -|
| 一个|2022年11月28日00:00:00|
| 一个|2022年11月28日00:00:10|
| 2个|2022年11月28日00:00:20|
| 2个|2022年11月28日00:00:30|
| 2个|2022年11月28日00:00:40|
| 三个|2022年11月28日00:00:50|
| 三个|2022年11月28日00:01:10|
| 一个|2022年11月28日00:01:20|
| 2个|2022年11月28日00时01分30秒|
| 2个|2022年11月28日00:01:40|
| 三个|2022年11月28日00时01分50秒|
| 三个|2022年11月28日00:02:10|
| 三个|2022年11月28日00:02:20|
| 四个|2022年11月28日00:02:30|
我需要根据时间戳顺序为event_id列获取单调递增的值。
| 事件标识|时间戳记|
| - -|- -|
| 一个|2022年11月28日00:00:00|
| 一个|2022年11月28日00:00:10|
| 2个|2022年11月28日00:00:20|
| 2个|2022年11月28日00:00:30|
| 2个|2022年11月28日00:00:40|
| 三个|2022年11月28日00:00:50|
| 三个|2022年11月28日00:01:10|
| 四个|2022年11月28日00:01:20|
| 五个|2022年11月28日00时01分30秒|
| 五个|2022年11月28日00:01:40|
| 六个|2022年11月28日00时01分50秒|
| 六个|2022年11月28日00:02:10|
| 六个|2022年11月28日00:02:20|
| 七个|2022年11月28日00:02:30|
理想情况下,我需要在一个select语句中完成这一操作,我尝试了很多不同的方法,但都没有达到我的要求。有什么建议吗?谢谢

ecbunoof

ecbunoof1#

您可以为相似event_id的每个“块”分配唯一的行号:

with cte as (
   select (select sum(case when t1.event_id != t.event_id then 1 else 0 end) 
           from tbl t1 where t1.timestamp <= t.timestamp) k, t.* 
   from tbl t
)
select t3.r, v.value from (select row_number() over (order by (
     select max(v.value::text) from json_array_elements(t2.js) v)) r, t2.* from (
       select t1.event_id, t1.k, json_agg(t1.timestamp) js from cte t1 
       group by t1.event_id, t1.k) t2) t3 
cross join json_array_elements(t3.js) v

See fiddle

kiz8lqtg

kiz8lqtg2#

每当event_id随时间戳的增加而更改时,使用设置为1的标志的运行总和尝试执行以下操作。

select sum(flag) over (order by timestamp) +1 as event_id,
       timestamp 
from
(
  select *,
  case 
   when lag(event_id, 1, event_id)
        over (order by timestamp) <> event_id
   then 1 else 0
  end as flag
  from table_name 
) T
order by timestamp

相关问题