在Postgresql的SQL查询中根据特定条件增加列值[英] Increment column value on certain condition in SQL query on Postgresql

本文是小编为大家收集整理的关于在Postgresql的SQL查询中根据特定条件增加列值的处理方法,想解了在Postgresql的SQL查询中根据特定条件增加列值的问题怎么解决?在Postgresql的SQL查询中根据特定条件增加列值问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

如果周之间的休息时间大于 2 周,我想按周汇总我与动物的步行,将我的行分组为 1 组.

我有我的桌子:

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)

我在使用 dense_rank() 和 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;

本文地址:https://www.itbaoku.cn/post/1764156.html