gpt4 book ai didi

sql - 如何根据 PostgreSQL 中的行差异有条件地合并行?

转载 作者:行者123 更新时间:2023-11-29 14:36:08 26 4
gpt4 key购买 nike

我已经完成了一些相关的合并问题,但我的问题与现有问题略有不同。我的 PostgreSQL 9.5 数据库中有一个表,其中包含四列,即 Segment(唯一组)、height(数字)、lower_limit(数字)和 upper_limit(数字)。示例数据如下:

Segment height  lower_limit upper_limit
A 19.3 112 142
A 19.3 142 172
A 20.3 172 202
A 20.3 202 232
A 19.3 232 262
A 19.3 262 292
B 22.1 203 233
B 22.1 233 263
B 22.1 263 293
B 22.1 293 323
B 22.1 323 353
B 22.1 353 383
C 18.9 136 166
C 18.9 166 196
C 18.9 196 226
C 27.1 286 316
C 27.1 316 346
C 6.5 346 376
C 6.5 376 406

我需要根据高度值的差异有条件地合并行。我会尝试分步骤解释:

  • 从第一个高度开始,检查前后行之间的差异是否小于或等于1
  • 如果条件满足,合并第一行下限和合并行上限的行
  • 如果所有行都合并到一个组中,则选择最常见的高度,下限为第一行和最后合并行的上限
  • 对其他组重复此操作

    基于以上,期望的输出可能是这样的:

    段高度 lower_limit upper_limit
    19.3 112 292
    乙 22.1 203 383
    C 18.9 136 226
    C 27.1 286 346
    C 6.5 346 406

有人可以帮我根据高度差值有条件地合并行吗?

最佳答案

假设 lower_limit 列可以用于排序,你可以使用

select segment,mode() within group(order by height),min(lower_limit),max(upper_limit) 
from (select t.*
,sum(case when abs(height-prev) <= 1 then 0 else 1 end) over(partition by segment order by lower_limit) as grp
from (select t.*
,lag(height) over(partition by segment order by lower_limit) as prev
from tbl t
) t
) t
group by segment,grp

关于sql - 如何根据 PostgreSQL 中的行差异有条件地合并行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44474081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com