按模糊条件分组

时间:2019-10-18 20:38:25

标签: sql postgresql

我需要按复杂的条件对表中的行进行分组。假设我有一张桌子:

usize

其中包含以下内容:

create table items (
   name text,
   price float
)

前两个foo | 42.0 foo | 42.5 foo | 100 bar | 42 的价格相差不到10%(条件类似于foo),因此它们应归为一个组,而其他(第3个){ {1}}和a.price / b.price between 0.9 and 1.1应该在不同的组中,并且预期结果应该是这样的:

foo

可以使用sql查询吗?

1 个答案:

答案 0 :(得分:0)

基于您的评论中的假设,您可以寻找滞后时间以根据相对价格定义组的起始位置。然后,对“分组开始”进行累加,以计算分组ID,然后进行汇总:

select item, min(price), max(price), count(*)
from (select i.*,
             count(*) over (filter where prev_price < 0.9 * price) over (partition by item order by price) as grp
      from (select i.*,
                   lag(price) over (partition by item order by price) as prev_price
            from items i
           ) i
     ) i
group by item
order by item, min(price);