我想找到彼此相似的行,并用新行替换它们。我的表看起来像这样:
OrderID | Price | Minimum Number | Maximum Number | Volume
1 45 2 10 250
2 46 2 10 250
3 60 2 10 250
此上下文中的“类似”表示具有相同的最大数量,最小数量和体积的行。价格可以不同,但差异最多可以是2.
在此示例中,OrderID为1和2的订单类似,但3不是(因为即使它具有相同的最小数量,最大数量和数量,其价格也不在订单1和2的2个单位内)
然后,我希望将订单1和2替换为新订单,让我们说订单ID 4,它具有相同的最小数量和最大数量。它的数量是它正在取代的订单量的总和。其价格可以是将在输出表中删除的任何先前订单的价格(在此示例中为45或46)。因此,上面示例的输出将是:
OrderID | Price | Minimum Number | Maximum Number | Volume
4 45 2 10 500
3 60 2 10 250
答案 0 :(得分:1)
以下是在SQL Server 2012或Oracle中执行此操作的方法。我们的想法是使用lag()
来查找组的开始和结束位置,然后进行汇总。
select min(id) as id, min(price) as price, MinimumNumber, MaximumNumber, sum(Volume)
from (select t.*,
sum(case when prev_price < price - 2 then 1 else 0 end) over
(partition by MinimumNumber, MaximumNumber, Volume order by price) as grp
from (select t.*,
lag(price) over (partition by MinimumNumber, MaximumNumber, Volume
order by price
) as prev_price
from table t
) t
) t
group by grp, price, MinimumNumber, MaximumNumber;
唯一的问题是id
的设置。我不确定具体的规则是什么。