Использование SQL DENSE_RANK для определения дубликатов - PullRequest
1 голос
/ 15 июля 2011

Вот пример данных, для которых я пытаюсь найти все заказы с одинаковыми количествами, игнорируя столбец OrderID

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

Итак, я использовал функцию DENSE_RANK в SQL

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

Итак, на основании ранжирования я смог отфильтровать записи с одинаковым количеством по разным идентификаторам заказов и обработать их как единое целое. Пока все хорошо и я счастлив. Но, еще одно сумасшедшее требование - эта форма агрегации должна быть сделана только для первого изменения количества. Например, если приведенные выше данные похожи на приведенные ниже

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 ]

1 голос
/ 17 июня 2013

Это выглядит немного грязно, но я думаю, что это правильно:

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

См. скрипка

1 голос
/ 23 мая 2013

Если я вас правильно понимаю, вы хотите использовать DENSE_RANK(), чтобы исключить повторяющиеся строки в ваших данных.

Кажется, вы уже решили свою проблему.Если вы хотите удалить дубликаты, используйте тот же код SQL, который вы использовали выше, и удалите все строки с Ranking > 1.В результате у вас останется одна копия каждой строки с одинаковым уникальным ключом (например, Product, Location, Customer, OrderID).

...