1

这是我试图查找具有相同数量的所有订单的数据示例,忽略 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

因此,根据排名,我能够过滤掉不同 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 以获得上述行为?

感谢您的任何建议。

4

2 回答 2

2

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

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

于 2013-05-23T19:42:56.117 回答
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

小提琴

于 2013-06-17T16:22:51.117 回答