我有一个数据集,其中列出了使用连续系列的出价,例如路边临街,可以用起点和终点里程(十进制值)来识别。 开发商已竞标使用一定数量的临街道路。我想通过以下方式筛选这些:a)根据最高出价对它们进行排名,然后 b) 将它们汇总起来,以便丢弃与排名较高的投标重叠的任何投标。 我从开始和结束里程创建了一个
NUMRANGE
:
with rg as
(select numrange(start_ch_km, end_ch_km,'[]'), * from recieved_bids tr order by bid_price desc)
select * from rg rg1 join rg rg2 on rg1.numrange && rg2.numrange
这给了我最高的出价与较低的出价重叠。 但是,我无法找到一种方法来忽略与较高排名的出价重叠的出价,从而为较低排名的出价留下空闲空间。在下图中,我只想返回排名 1、4 和 7。
这可以用
GROUP
或
PARTITION
GROUP BY
函数。使用递归 cte 可能最容易实现这一点。在下面的代码中,我使用第一个 cte 按价格降序对出价进行排名,然后查询的递归部分依次循环遍历每个出价,如果与之前接受的任何出价没有重叠,则接受它们出价存储为多范围,并随每个接受的出价更新。