使用SQL DENSE_RANK确定重复项

时间:2011-07-15 17:10:01

标签: sql sql-server-2005 rank dense-rank

以下是我尝试查找具有相同数量的所有订单的数据示例,忽略了OrderID列

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

因此,根据排名,我能够过滤掉不同订单ID中具有相同数量的记录,并将它们视为一个。 到目前为止,一切都很好,我很高兴。但是,另一个疯狂的要求是这种形式的聚合应该只针对数量的第一次变化。例如,如果上面的数据恰好是下面的数据

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以获得上述行为?

感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

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

看来你已经解决了问题。如果要消除重复项,请使用上面的相同SQL代码并删除Ranking > 1的所有行。这将为您留下具有相同唯一键的每行的一个副本(例如ProductLocationCustomerOrderID)。

答案 1 :(得分: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