满足条件时选择记录

时间:2021-06-11 16:55:07

标签: sql ssms

我正在尝试提出一个 SQL,当错误值为“true”并且该人的姓名和日期相同时,该 SQL 不会选择记录。我想也许是使用 IN 函数的主查询,其中参数将是一个子查询,它将识别 User_ID 和 Error_Dt 的重复项。例如:

样本数据:

+----------+-------+---------+----------+
| Error_ID | Error | User_ID | Error_Dt | 
+----------+-------+---------+----------+
| Err_A_01 | True  | JP_123  | 20200307 |
| Err_A_02 | True  | DF_455  | 20200605 |
| Err_A_03 | True  | DF_455  | 20200605 |
| Err_A_04 | False | DF_455  | 20200703 |
| Err_B_01 | False | BH_135  | 20200219 |
| Err_B_02 | True  | DP_246  | 20200310 |
| Err_B_03 | True  | DP_246  | 20200310 |
| Err_B_04 | True  | DP_246  | 20200509 |
| Err_B_05 | False | DP_246  | 20200601 |
| Err_B_06 | True  | KS_159  | 20200120 |
| Err_B_07 | True  | KS_159  | 20200120 |
| Err_B_08 | True  | KS_159  | 20200310 |
| Err_C_01 | False | JH_123  | 20200702 |
+----------+-------+---------+----------+

期望结果:

+----------+-------+---------+----------+
| Error_ID | Error | User_ID | Error_Dt | 
+----------+-------+---------+----------+
| Err_A_01 | True  | JP_123  | 20200307 |
| Err_A_04 | False | DF_455  | 20200703 |
| Err_B_01 | False | BH_135  | 20200219 |
| Err_B_04 | True  | DP_246  | 20200509 |
| Err_B_05 | False | DP_246  | 20200601 |
| Err_B_08 | True  | KS_159  | 20200310 |
| Err_C_01 | False | JH_123  | 20200702 |
+----------+-------+---------+----------+

2 个答案:

答案 0 :(得分:1)

仅选择唯一的 Error + User_ID + Error_Dt 行或那些不是“真”的行。

select Error_ID, Error, User_ID, Error_Dt
from (
    select *,
      count(*) over(partition by Error, User_ID, Error_Dt) cnt
    from tbl ) t
where Error <> 'True' OR cnt = 1
order by Error_ID;

答案 1 :(得分:0)

使用 CTE 来确定哪些 User_ID 具有多行,其中 Error = True 和相同的 Error_Dtleft join具有相同 User_IDError_DtCTE 中多于 1 行的记录的原始表,然后只提取那些没有匹配的记录。

with non_select as (
select t.User_ID
    , t.Error_Dt
    , count(*) over (partition by User_ID, Error, Error_Dt) cnt
from tbl t
where t.Error = 'True'
)
select t.*
from tbl t
left join non_select ns
    on t.User_ID = ns.User_ID
    and t.Error_Dt = ns.Error_Dt
    and ns.cnt > 1
where ns.User_ID is null

如果我正确理解了您的问题,这应该可以满足您的需求。

示例结果:

Example results