簡體   English   中英

在Postgresql上的SQL查詢中某些條件下的列值遞增

[英]Increment column value on certain condition in SQL query on Postgresql

如果兩周之間的休息時間大於2周,我希望將我的行與動物聚集起來,將我的行分成幾組。

我有桌子:

Create table test.walk (animal text, week integer)

我想分組的每個步行行都有:

insert into test.walk values ('DOG', 2)
insert into test.walk values ('DOG', 3)
insert into test.walk values ('DOG', 4)
insert into test.walk values ('CAT', 1)
insert into test.walk values ('CAT', 1)
insert into test.walk values ('CAT', 11)
insert into test.walk values ('CAT', 12)
insert into test.walk values ('CAT', 13)

我在密集窗口函數和lag()中掙扎,但是沒有運氣獲得額外的列,因此我應該得到3個不同的值。

這是我想要的輸出:

在此處輸入圖片說明

我應該使用窗口功能的哪種組合來獲得CAT的兩個WALK_NO? (如果在第1周之后,一只貓等了我2周以上)

使用lag()和累計和:

with query as (
select w.*,
       sum(case when week < prev_week + 2 then 0 else 1 end) over (partition by animal order by week) as grp
from (select w.*,
             lag(week) over (partition by animal order by week) as prev_week
      from test.walk w
     ) w
)
select
    animal, week, grp,
    dense_rank() over (order by animal, grp) as grp2
from query

查詢輸出

注意:這將重新開始對每只動物的計數-這似乎是您想要做的實際意圖。 如果您希望各組之間用動物隔開,但要逐漸增加,則問題的定義有些棘手。 一種方法是:

select w.*,
       sum(case when prev_week = week then 0 else 1 end) over (order by min_week, animal, week) as grp
from (select w.*,
             lag(week) over (partition by animal order by week) as prev_week,
             min(week) over (partition by animal) as min_week
      from test.walk w
     ) w;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM