Удаление дубликатов в строках - PullRequest
0 голосов
/ 27 февраля 2019

Мне нужен был запрос для удаления дубликатов из данных, перечисленных ниже.

SurveyDate    Rentaldate    outbound    inbound  vehiclesize  lolarate   kayrate
1/24/19        2/7/19         5          5         small       832        null
1/24/19        2/7/19         5          5         small    **855**       null
1/24/19        2/7/19         5          5         large       831        null
1/24/19        2/7/19         5          5         large    **851**       null
1/24/19        2/7/19         5          5         small       null       432
1/24/19        2/7/19         5          5         small       null     **455**
1/24/19        2/7/19         5          5         large       null       431
1/24/19        2/7/19         5          5         large       null     **451**

Задайте его, чтобы получить максимальное значение для всех рядов с одинаковым размером транспортного средства.Например, результат должен выглядеть примерно так:

SurveyDate    Rentaldate    outbound    inbound  vehiclesize  lolarate   kayrate
1/24/19        2/7/19         5          5         small    **855**       null
1/24/19        2/7/19         5          5         large    **851**       null
1/24/19        2/7/19         5          5         small       null     **455**
1/24/19        2/7/19         5          5         large       null     **451**

Ниже приведен запрос, который я собрал, чтобы устранить дублирование, дайте мне знать, что вы об этом думаете:

select 
    SURVEY_DATE, 
    OUTBOUND, INBOUND, 
    MAX(lola_RATE) AS lola_SM,
    MAX(kay_RATE) AS kay_SM
from TABLE1
group by  OUTBOUND, INBOUND, SURVEY_DATE;

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Результаты, которые вы хотите получить, немного хитры.MAX() в качестве оконной функции может быть лучшим подходом:

SELECT t.*
FROM (SELECT t.*,
             MAX(kayrate) OVER (PARTITION BY SurveyDate, Rentaldate, outbound, inbound, vehiclesize) as max_kayrate,
             MAX(lolarate) OVER (PARTITION BY SurveyDate, Rentaldate, outbound, inbound, vehiclesize) as max_lolarate
      FROM t
     ) t
WHERE kayrate = max_kayrate OR
      lolarate = max_lolarate
0 голосов
/ 27 февраля 2019

Это близко.Но теперь ваш запрос возвращает только одну строку:

SURVEYDATE RENTALDATE   OUTBOUND    INBOUND         LR         KR
---------- ---------- ---------- ---------- ---------- ----------
1/24/19    2/7/19              5          5        855        455

Если вы добавите vehiclesize к выбранным столбцам и в предложении group by будет показано:

SURVEYDATE RENTALDATE   OUTBOUND    INBOUND VEHICLESIZE         LR         KR
---------- ---------- ---------- ---------- ----------- ---------- ----------
1/24/19    2/7/19              5          5 small              855        455
1/24/19    2/7/19              5          5 large              851        451

Если вы хотитечтобы показать пустые столбцы отдельно, вы можете использовать эту условную группировку:

select SurveyDate, Rentaldate, outbound, inbound, vehiclesize, 
       max(lolarate) lr, max(kayrate) kr
 from table1 
 group by 
       SurveyDate, Rentaldate, outbound, inbound, vehiclesize, 
       case when lolarate is null then 1 end,
       case when kayrate  is null then 1 end

демо

SURVEYDATE RENTALDATE   OUTBOUND    INBOUND VEHICLESIZE         LR         KR
---------- ---------- ---------- ---------- ----------- ---------- ----------
1/24/19    2/7/19              5          5 small              855 
1/24/19    2/7/19              5          5 small                         455
1/24/19    2/7/19              5          5 large              851 
1/24/19    2/7/19              5          5 large                         451
0 голосов
/ 27 февраля 2019

Ваш запрос - хорошее начало, вам просто нужно добавить все неагрегированные столбцы в предложении GROUP BY:

SELECT 
    SurveyDate, 
    Rentaldate, 
    outbound, 
    inbound, 
    vehiclesize,
    MAX(kayrate),
    MAX(lolarate)
FROM mytable
GROUP BY
    SurveyDate, 
    Rentaldate, 
    outbound, 
    inbound, 
    vehiclesize

Другой вариант - использовать ROW_NUMBER() без агрегирования (этоработает, если, как показано в ваших данных примера, один из двух столбцов для агрегирования всегда NULL):

SELECT * FROM (
    SELECT 
        t.*, 
        ROW_NUMBER() OVER(
            PARTITION BY SurveyDate, Rentaldate, outbound, inbound, vehiclesize
            ORDER BY kayrate DESC, lolarate DESC
         ) rn
    FROM mytable t
) x WHERE rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...