基于TableB的Datetime与Partid过滤TableA数据的SQL需求
数据过滤需求与解决方案
TableB 结构与数据
| Datetime | Partid |
|---|---|
| 2022-12-24T15:20:00.782Z | Part-A |
| 2022-12-24T15:21:00.782Z | Part-B |
| 2022-12-24T15:22:00.782Z | Part-B |
| 2022-12-24T15:23:00.782Z | Part-A |
| 2022-12-24T15:24:00.782Z | Part-B |
| 2022-12-24T15:25:00.782Z | Part-A |
TableA 结构与数据
| Datetime | Partid | Customer ID |
|---|---|---|
| 2022-12-24T15:20:00.782Z | Part-A | CUSTOMER-A |
| 2022-12-24T15:20:00.782Z | Part-B | CUSTOMER-B |
| 2022-12-24T15:20:00.782Z | Part-B | CUSTOMER-C |
| 2022-12-24T15:20:00.782Z | Part-A | CUSTOMER-D |
| 2022-12-24T15:21:00.782Z | Part-D | CUSTOMER-E |
| 2022-12-24T15:21:00.782Z | Part-A | CUSTOMER-F |
| 2022-12-24T15:21:00.782Z | Part-B | CUSTOMER-G |
| 2022-12-24T15:21:00.782Z | Part-B | CUSTOMER-H |
| 2022-12-24T15:22:00.782Z | Part-B | CUSTOMER-I |
| 2022-12-24T15:22:00.782Z | Part-E | CUSTOMER-J |
| 2022-12-24T15:22:00.782Z | Part-F | CUSTOMER-K |
| 2022-12-24T15:22:00.782Z | Part-D | CUSTOMER-L |
| 2022-12-24T15:22:00.782Z | Part-A | CUSTOMER-M |
| 2022-12-24T15:23:00.782Z | Part-B | CUSTOMER-N |
| 2022-12-24T15:23:00.782Z | Part-C | CUSTOMER-O |
| 2022-12-24T15:23:00.782Z | Part-A | CUSTOMER-P |
| 2022-12-24T15:23:00.782Z | Part-B | CUSTOMER-Q |
| 2022-12-24T15:23:00.782Z | Part-E | CUSTOMER-R |
需求说明
根据TableB的条件过滤TableA数据:仅排除TableB中Datetime在2022-12-22T15:22:00.782Z至2022-12-24T15:20:00.782Z区间内的Part-A、Part-B对应的TableA数据,最终获取剩余数据的Customer ID列表(保留完整行信息)。
解决方案
以下是两种可实现需求的SQL写法:
方法1:NOT EXISTS子查询
SELECT a.Datetime, a.Partid, a.`Customer ID` FROM TableA a WHERE NOT EXISTS ( SELECT 1 FROM TableB b WHERE b.Partid IN ('Part-A', 'Part-B') AND b.Datetime BETWEEN '2022-12-22T15:22:00.782Z' AND '2022-12-24T15:20:00.782Z' AND a.Datetime = b.Datetime AND a.Partid = b.Partid );
方法2:LEFT JOIN过滤
SELECT a.Datetime, a.Partid, a.`Customer ID` FROM TableA a LEFT JOIN ( SELECT Datetime, Partid FROM TableB WHERE Partid IN ('Part-A', 'Part-B') AND Datetime BETWEEN '2022-12-22T15:22:00.782Z' AND '2022-12-24T15:20:00.782Z' ) b ON a.Datetime = b.Datetime AND a.Partid = b.Partid WHERE b.Datetime IS NULL;
期望输出
| Datetime | Partid | Customer ID |
|---|---|---|
| 2022-12-24T15:21:00.782Z | Part-D | CUSTOMER-E |
| 2022-12-24T15:22:00.782Z | Part-E | CUSTOMER-J |
| 2022-12-24T15:22:00.782Z | Part-F | CUSTOMER-K |
| 2022-12-24T15:22:00.782Z | Part-D | CUSTOMER-L |
| 2022-12-24T15:23:00.782Z | Part-B | CUSTOMER-N |
| 2022-12-24T15:23:00.782Z | Part-C | CUSTOMER-O |
| 2022-12-24T15:23:00.782Z | Part-A | CUSTOMER-P |
| 2022-12-24T15:23:00.782Z | Part-B | CUSTOMER-Q |
| 2022-12-24T15:23:00.782Z | Part-E | CUSTOMER-R |
内容的提问来源于stack exchange,提问作者Abhishek Kumar
相关产品推荐
相关产品推荐

