2011-07-15 36 views
1

这里是我想找到所有与相同数量的订单数据的例子,忽略了订单ID列使用SQL DENSE_RANK确定重复

Product  Location  Customer OrderID Quantity 
Eggs  Chicago  XYZ  2011  10 
Eggs  Chicago  XYZ  2012  10 
Eggs  Chicago  XYZ  2013  15 

所以,我在SQL中使用DENSE_RANK函数

Select Product,Location,Customer,OrderID,Quantity, 
Ranking = DENSE_RANK() OVER (PARTITION BY Product,Location,Customer,Quantity 
ORDER BY OrderID ASC) 
FROM MyTable 

得到以下

Product  Location  Customer OrderID Quantity Ranking 
Eggs  Chicago  XYZ  2011  10  1 
Eggs  Chicago  XYZ  2012  10  2 
Eggs  Chicago  XYZ  2013  15  1 

所以数据的基础上,我西澳排名可以过滤不同orderID中具有相同数量的记录并将它们视为一个。 到目前为止,一切都很好,我很高兴。但是,另一个疯狂的要求是这种聚合形式应该只在第一次数量变化时完成。例如,如果上述数据恰好是这样一个低于

Product  Location  Customer OrderID Quantity 
Eggs  Chicago  XYZ  2011  10 
Eggs  Chicago  XYZ  2012  10 
Eggs  Chicago  XYZ  2013  15 
Eggs  Chicago  XYZ  2014  15 
Eggs  Chicago  XYZ  2015  15 

相同的SQL会产生导致

Product  Location  Customer OrderID Quantity Ranking 
Eggs  Chicago  XYZ  2011  10  1 
Eggs  Chicago  XYZ  2012  10  2 
Eggs  Chicago  XYZ  2013  15  1 
Eggs  Chicago  XYZ  2013  15  2 
Eggs  Chicago  XYZ  2013  15  3 

但是,我需要的结果是

Product  Location  Customer OrderID Quantity Ranking 
Eggs  Chicago  XYZ  2011  10  1 
Eggs  Chicago  XYZ  2012  10  2 
Eggs  Chicago  XYZ  2013  15  1 
Eggs  Chicago  XYZ  2013  15  1 
Eggs  Chicago  XYZ  2013  15  1 

请,请注意,在首次更改数量后,所有记录的排名仍为1。

是否可以调整我的SQL以获得上述行为?

感谢您的任何建议。

+0

应该将订单确实是2013年在每一个你想要的数据的最后三排的?即使他们是你的样本数据中的2013年,2014年,2015年 – Tobsey

+0

使用ROW_NUMBER而不是DENSE_RANK怎么样? –

+0

ROW_NUMBER(),RANK()都给出相同的行为 – user320587

回答

1

如果我理解正确,您想使用DENSE_RANK()消除数据中的重复行。

看来你已经解决了你的问题。如果您想消除重复项,请使用上述相同的SQL代码,并使用Ranking > 1删除任何行。这将为每一行提供一个具有相同唯一密钥的副本(例如Product,Location,Customer,OrderID)。

1

这感觉有点脏,但我认为这是正确的:

SELECT 
    Product, 
    Location, 
    Customer, 
    OrderID, 
    Quantity, 
    DENSE_RANK() 
    OVER (PARTITION BY 
      Product, 
      Location, 
      Customer, 
      Quantity 
      ORDER BY 
      CASE WHEN 
       Quantity = (SELECT MIN(Quantity) FROM Orders) THEN OrderID 
      ELSE 0 END ASC 
     ) AS Ranking 
FROM 
    Orders 

fiddle