我正在尝试提出一个 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 |
+----------+-------+---------+----------+
答案 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_Dt
,left join
具有相同 User_ID
、Error_Dt
和 CTE
中多于 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
如果我正确理解了您的问题,这应该可以满足您的需求。
示例结果: