我正在处理数百万数据,我想过滤 2 个不同的列,这些列具有同一组键组合的 2 个不同记录,
桌子看起来像:
SK | 不 | 姓名 | DOB | TS | EFF_DT | 来源 |
---|---|---|---|---|---|---|
123 | 1 | 托马斯 | 1/12/1994 | 2024-29-03T00:00:00 | 24-03 | ABC |
123 | 1 | 托马斯 | 1/12/1994 | 2024-29-03T12:00:00 | 24-05 | ABC |
456 | 1 | 托马斯 | 1/12/1994 | 2024-29-04T00:00:00 | 14-03 | CBA |
456 | 1 | 托马斯 | 1/12/1994 | 2024-29-04T12:00:00 | 14-03 | CBA |
我想根据关键列组合来过滤记录,即 SK 和 NO 列对于不同的 TS 和 eff_dt 是相同的,并且不想选择 TS 单独不同的记录。
有人可以解释一下如何实现这一目标吗?
提前致谢!
预期产出:
SK | 不 | 姓名 | DOB | TS | EFF_DT | 来源 |
---|---|---|---|---|---|---|
123 | 1 | 托马斯 | 1/12/1994 | 2024-29-03T00:00:00 | 24-03 | ABC |
123 | 1 | 托马斯 | 1/12/1994 | 2024-29-03T12:00:00 | 24-05 | ABC |
首先,我们使用 GROUP BY
和 HAVING
子句识别在两个单独的列中具有两个唯一值的
SK和
NO的组合:
SELECT SK, NO
FROM mytable
GROUP BY SK, NO
HAVING COUNT(DISTINCT TS) = 2 AND COUNT(DISTINCT EFF_DT) = 2
然后,为了获得所需的结果,我们将其与原始表合并:
SELECT t.*
FROM mytable t
INNER JOIN (
SELECT SK, NO
FROM mytable
GROUP BY SK, NO
HAVING COUNT(DISTINCT TS) = 2 AND COUNT(DISTINCT EFF_DT) = 2
) AS s ON s.SK = t.SK AND s.NO = t.NO