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 で同じ数量を持つレコードを除外し、それらを 1 つとして扱うことができました。これまでのところ、すべてが順調で、満足しています。しかし、別のクレイジーな要件の 1 つは、この形式の集計は数量の最初の変更に対してのみ実行する必要があるということです。たとえば、上記のデータがたまたま下のような場合

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

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 に答える