Как удалить дубликаты из этого запроса? - PullRequest
0 голосов
/ 23 октября 2018

Мой запрос:

   WITH PH AS(
            SELECT CHR,CHNO,CHSQ,CHVR,CHSB
            ,ROW_NUMBER () OVER(PARTITION BY  CHNO ORDER BY CHSQ,CHVR DESC ) TEMP
            FROM WRPD.WSCL 
            WHERE CHAD > '20180901' 
            AND CHSB ='P' 
            AND CHB1 in ('L1', 'R2')
            ),
    DT AS(SELECT CHR,CHNO,CHSQ,CHVR,CHSB
            ,ROW_NUMBER () OVER(PARTITION BY  CHNO ORDER BY CHSQ,CHVR DESC ) TEMP
            FROM WRPD.WSCL
            WHERE CHAD > '20180901' 
            AND CHSB IN ('R','A','Q')
            AND CHB1 in ('L1', 'R2')
            )

SELECT * 
        FROM PH A
        WHERE A.TEMP=1
         UNION
        SELECT * 
        FROM DT B
        WHERE B.TEMP=1

Пример данных:
В первых 8 строках столбцы являются дубликатами, кроме значений CHVR, CHSB и Temp

CHR CHNO  CHSQ CHVR CHSB TEMP
A   F41  841    1   P   1
A   F41  841    0   R   2
B   447  147    1   P   1
B   447  147    0   R   2
C   742  742    1   P   1
C   742  742    0   R   2
D   231  135    3   P   1
D   231  135    2   R   2
E   749  417    0   A   1
E   775  153    0   P   1
E   775  153    0   A   1
E   178  833    1   Q   1
E   184  418    0   A   1
E   192  419    0   P   1
E   193  419    0   P   1
E   194  444    0   P   1
E   198  263    0   A   1
E   204  450    0   A   1
E   203  120    0   A   1

ЖелательноРезультат:

Мне нужен результат с CHSB = 'P', что означает: в основном, если CHR = CHR и CHNO = CHNO AND CHSQ = CHSQ, то отобразить значения, когда CHSB = 'P', также CHVR из«P» будет больше, чем CHVR «R».

CHR CHNO CHSQ CHVR CHSB TEMP
A   F41  841    1   P   1
B   447  147    1   P   1
C   742  742    1   P   1
D   231 135    3    P   1
E   749 417    0    A   1
E   775 153    0    P   1
E   775 153    0    A   1
E   178 833    1    Q   1
E   184 418    0    A   1
E   192 419    0    P   1
E   193 419    0    P   1
E   194 444    0    P   1
E   198 263    0    A   1
E   204 450    0    A   1
E   203 120    0    A   1

Я не уверен, как и где включить условия в запрос.Заранее спасибо

РЕДАКТИРОВАТЬ: Под этим утверждением also CHVR of 'P' will be greater than CHVR of 'R': я имел в виду: например, когда мы смотрим на пример данных: следующие две строки дублируют друг друга:

CHR CHNO  CHSQ CHVR CHSB TEMP
A   F41  841    1   P     1
A   F41  841    0   R     2

Теперь я хочу удалить строки с CHSB = 'P'.Но три столбца различаются по этим дубликатам:

    CHVR=Version
   ,CHSB=Status
   ,TEMP=Temporary Value

Теперь, следующее условие всегда будет выполнено: В дублирующейся строке, когда Status='P' Version='1' и Status='R' Version='0'

Это означает, чтоvalue of version (1) for status='P' больше value of version(0) for status='R'.

Ответы [ 4 ]

0 голосов
/ 24 октября 2018

Я получил желаемый результат по этому запросу:

   WITH PH AS(
            SELECT CHR,CHNO,CHSQ,CHVR,CHSB
            ,ROW_NUMBER () OVER(PARTITION BY  CHNO ORDER BY CHSQ,CHVR DESC ) TEMP
            FROM WRPD.WSCL 
            WHERE CHAD > '20180901' 
            AND CHSB ='P' 
            AND CHB1 in ('L1', 'R2')

            **UNION
            SELECT B.CHR,B.CHNO,B.CHSQ,B.CHVR,B.CHSB
            ,ROW_NUMBER () OVER(PARTITION BY  B.CHNO ORDER BY B.CHSQ,B.CHVR DESC ) TEMP
            FROM WRPD.WSCL A JOIN WRPD.WSCL B
            WHERE B.CHAD > '20180901'
             AND B.CHB1 in ('L1', 'R2')
             AND A.CHB1 in ('L1', 'R2') 
             AND A.CHSB ='P'
             AND A.CHSB ='R'
             AND CASE WHEN A.CHNO=B.CHNO AND A.CHVR>B.CHVR THEN 0
                     WHEN A.CHNO<>B.CHONO THEN 0 ELSE 1 END=1**

            ),
    DT AS(SELECT CHR,CHNO,CHSQ,CHVR,CHSB
            ,ROW_NUMBER () OVER(PARTITION BY  CHNO ORDER BY CHSQ,CHVR DESC ) TEMP
            FROM WRPD.WSCL
            WHERE CHAD > '20180901' 
            AND CHSB IN ('R','A','Q')
            AND CHB1 in ('L1', 'R2')
            )

SELECT * 
        FROM PH A
        WHERE A.TEMP=1
         UNION
        SELECT * 
        FROM DT B
        WHERE B.TEMP=1
0 голосов
/ 23 октября 2018

Это вопрос с подвохом?Чтобы получить требуемый результат из ваших входных данных, вам просто нужно сказать WHERE CHSB <> 'R'

WITH T(CHR,CHNO,CHSQ,CHVR,CHSB,TEMP) AS
(VALUES
 ('A','F41',841,1,'P',1)
,('A','F41',841,0,'R',2)
,('B','447',147,1,'P',1)
,('B','447',147,0,'R',2)
,('C','742',742,1,'P',1)
,('C','742',742,0,'R',2)
,('D','231',135,3,'P',1)
,('D','231',135,2,'R',2)
,('E','749',417,0,'A',1)
,('E','775',153,0,'P',1)
,('E','775',153,0,'A',1)
,('E','178',833,1,'Q',1)
,('E','184',418,0,'A',1)
,('E','192',419,0,'P',1)
,('E','193',419,0,'P',1)
,('E','194',444,0,'P',1)
,('E','198',263,0,'A',1)
,('E','204',450,0,'A',1)
,('E','203',120,0,'A',1)
)
SELECT CHR,CHNO,CHSQ,CHVR,CHSB,TEMP FROM T
WHERE CHSB <> 'R'


 CHR CHNO CHSQ CHVR CHSB TEMP
 --- ---- ---- ---- ---- ----
 A   F41   841    1 P       1
 B   447   147    1 P       1
 C   742   742    1 P       1
 D   231   135    3 P       1
 E   749   417    0 A       1
 E   775   153    0 P       1
 E   775   153    0 A       1
 E   178   833    1 Q       1
 E   184   418    0 A       1
 E   192   419    0 P       1
 E   193   419    0 P       1
 E   194   444    0 P       1
 E   198   263    0 A       1
 E   204   450    0 A       1
 E   203   120    0 A       1

Если это не то, что вы хотите.Я предлагаю вам удалить этот вопрос и попытаться задать его более понятным, минимальным и понятным способом.

0 голосов
/ 24 октября 2018
with a (CHR, CHNO, CHSQ, CHVR, CHSB, TEMP) as (values
  ('A', 'F41', 841, 1, 'P', 1)
, ('A', 'F41', 841, 0, 'R', 2)
, ('B', '447', 147, 1, 'P', 1)
, ('B', '447', 147, 0, 'R', 2)
-- ...
, ('E', '203', 120, 0, 'A', 1)
)
select CHR, CHNO, CHSQ, CHVR, CHSB, TEMP
from (
select a.*, rownumber() over (partition by CHR, CHNO, CHSQ order by case CHSB when 'P' then 0 else 1 end) rn_
from a
) 
where rn_=1;
0 голосов
/ 23 октября 2018
select chr, chrno, chsq, chvr, chsb, temp 
from mytable 
where chsb = 'P' or (chr, chrno, chsq) not in 
     (select chr, chrno, chsq from mytable where chsb = 'P')

Это может быть выполнено в вашей выходной таблице после того, как вы закончите добавлять все записи, которые вы хотели бы видеть там.Это предполагает, что все dupes состоят из ровно одного chsb = 'P' и одного chsb = SomethingElse.Если возможны три набора дублирования записей или возможны дублирования с использованием chsb, отличного от 'P', вам необходимо настроить иерархию, чтобы определить, какую запись вы хотите вернуть.Возможно, вам придется именовать таблицы и уточнять имена полей вместе с ними, чтобы устранить неоднозначность.Кроме того, почему вы получаете temp = 2 в ваших результатах, когда вы указали temp = 1 в вашем операторе select?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...