Извлекать дубликаты записей в разных сценариях - PullRequest
2 голосов
/ 12 мая 2019

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

Сценарий 1:

Мое требование заключается в том, чтобы«Мне нужно, чтобы значение COL A выводилось только в том случае, если в группе все значения в столбце B должны отличаться, и из разных значений одно из значений в COL B должно быть ВНЕШНИМ»

Я уже получилзапрос сценария из моего старого поста

SELECT test.colA
FROM test INNER JOIN (
    SELECT colA, COUNT(DISTINCT colB) AS cntUnique, COUNT(colB) AS cntAll 
    FROM test
    GROUP BY colA
)t ON test.colA = t.colA
GROUP BY test.colA
HAVING SUM(CASE WHEN colB = 'EXTERNAL' THEN 1 ELSE 0 END) = 1 
    AND MAX(t.cntUnique) = MAX(t.cntAll)

Сценарий 2:

Мое требование заключается в том, что «мне нужно значение COL A в качестве выходных данных, только если в группе один из значений в столбцеB должен быть ВНЕШНИМ, но все значения в группе не должны отличаться, и в COLB должны присутствовать некоторые другие значения, отличные от ВНЕШНЕГО.

Сценарий 3:

Необходимовыберите все записи, которые не подпадают под сценарий 1 и сценарий 2

Моя примерная запись и ее желаемый результат приведены ниже

enter image description here

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

Решение «Все в одном». Для получения необходимых данных набор результатов должен быть отфильтрован по столбцу SCENARIO_ID.

with
  test as (
    select
      *
     from (
       values (123, 'EXTERNAL'), (123, 'INTERNAL'),
              (456, 'INTERNAL'), (456, 'IBM'), (456, 'DELL'),
              (345, 'EXTERNAL'), (345, 'EXTERNAL'), (345, 'EXTERNAL'),
              (434, 'INTERNAL'), (434, 'US'), (434, 'US'), (434, 'EXTERNAL'),
              (567, 'INTERNAL'), (567, 'EXTERNAL'), (567, 'EXTERNAL'), (567, 'IBM'),
              (121, 'INTERNAL'), (121, 'INTERNAL'), (121, 'INTERNAL'),
              (131, 'EXTERNAL'), (131, 'IBM')
     ) t(cola, colb)
  ),
  t as (
    select
      cola,
      count(*) qnt,
      count(distinct colb) distinct_qnt,
      sum(iif(colb = 'EXTERNAL', 1, 0)) external_qnt
    from test
    group by cola
  )
select
  cola,
  iif(external_qnt = 0 or external_qnt = qnt,
        3, iif(external_qnt = 1 and distinct_qnt = qnt, 1, 2)) scenario_id
from t;

Выход:

+------+-------------+
| cola | scenario_id |
+------+-------------+
|  121 |           3 |
|  123 |           1 |
|  131 |           1 |
|  345 |           3 |
|  434 |           2 |
|  456 |           3 |
|  567 |           2 |
+------+-------------+

Проверьте это онлайн с Rextester .

0 голосов
/ 12 мая 2019

Для вашего сценария 1, я думаю, это тоже будет работать:

SELECT colA
FROM test 
GROUP BY colA
HAVING 
  SUM(CASE WHEN colB = 'EXTERNAL' THEN 1 ELSE 0 END) = 1 
  AND 
  COUNT(DISTINCT ColB) = COUNT(*)

Для вашего сценария 2 количество строк, содержащих 'EXTERNAL', должно быть больше 0 и меньше общего количества строк - 1 для каждого значения colA:

SELECT colA
FROM test 
GROUP BY colA
HAVING 
  SUM(CASE WHEN colB = 'EXTERNAL' THEN 1 ELSE 0 END) BETWEEN 1 AND COUNT(*) - 2 
  AND
  SUM(CASE WHEN colB <> 'EXTERNAL' THEN 1 ELSE 0 END) > 
  COUNT(DISTINCT ColB) - SUM(CASE WHEN colB = 'EXTERNAL' THEN 1 ELSE 0 END)

Для вашего Сценария 3 количество строк, содержащих 'EXTERNAL', должно быть либо 0, либо равно общему количеству строк для каждого значения colA:

SELECT colA
FROM test 
GROUP BY colA
HAVING 
  SUM(CASE WHEN colB = 'EXTERNAL' THEN 1 ELSE 0 END) IN (0, COUNT(*))

См. Демоверсию .
Результаты:

Сценарий 1

> | colA |
> | ---: |
> |  123 |
> |  131 |


Сценарий 2

> | colA |
> | ---: |
> |  434 |
> |  567 |


Сценарий 3

> | colA |
> | ---: |
> |  121 |
> |  345 |
> |  456 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...