首页 > 解决方案 > 获取不同场景下的重复记录

问题描述

我正在尝试编写一个查询来找出 B 列值不同的重复项。基本上我需要为三个场景编写查询。

场景一:

我的要求是“我需要 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)

场景二:

我的要求是“我需要 COL A 值作为输出,仅当在一组 B 列中的值之一应该是 EXTERNAL 时,但组内的所有值不应该不同,并且应该存在一些其他值COLB 值 EXTERNAL 以外的值。

场景 3:

需要选择所有不属于场景1和场景2的记录

我的示例记录及其所需结果如下所示

在此处输入图像描述

标签: sql-server

解决方案


“一体式”解决方案。结果集必须按 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在线测试。


推荐阅读