在Oracle SQL中的一列中查找并替换具有类似值的行

时间:2014-04-30 01:33:09

标签: sql-server select row

我想找到彼此相似的行,并用新行替换它们。我的表看起来像这样:

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

1 个答案:

答案 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的设置。我不确定具体的规则是什么。