sql-server - SelfJoin 从 Sql 中的表中排除相同的记录
问题描述
我试图忽略每个帐户的不同仪表的 startDate、endDate 和代码相同的记录。(一个账户可以有2个meter,每个meter有startdate,enddate和code)
样品表
Account Meter STARTDATE ENDDATE Code
1 101 4/10/2019 4/9/2020 ***Custom***
1 109 4/10/2019 4/9/2020 ***Custom***
1 101 4/22/2020 12/31/9999 HOLDOVER-ETF0_APR20
1 109 4/22/2020 12/31/9999 HOLDOVER-ETF0_APR20
2 202 1/25/2020 4/23/2020 GE_PMD_JAN20
2 208 2/24/2020 4/23/2020 GE_PMD_JAN20
2 202 4/24/2020 12/31/9999 GE-V-STD-ETF0
2 208 4/24/2020 12/31/9999 GE-V-STD-ETF0
预期结果
2 202 1/25/2020 4/23/2020 GE_PMD_JAN20
2 208 2/24/2020 4/23/2020 GE_PMD_JAN20
我已经尝试过以下查询,但这将返回给我具有相同开始日期、结束日期和代码的一次。
select m1.account,
m1.meter,
m1.STARTDATE,
m1.ENDDATE,
m1.Code
from #MultipleMeter m1
join #MultipleMeter m2 on m1.account = m2.account
where m1.meter <> m2.meter
and m1.STARTDATE <> m2.STARTDATE
and m1.ENDDATE <> m2.ENDDATE
and m1.Code <> m2.Code
group by m1.account,
m1.meter,
m1.STARTDATE,
m1.ENDDATE,
m1.code
order by account,
STARTDATE
如何重写查询以仅获取具有不同开始日期、结束日期和代码的记录?
解决方案
我想这会达到你的意思吗?
SELECT m1.account,
m1.meter,
m1.STARTDATE,
m1.ENDDATE,
m1.Code
FROM #MultipleMeter m1
LEFT JOIN #MultipleMeter m2
ON m1.account = m2.account
AND m1.StartDate = m2.StartDate
AND m1.EndDate = m2.EndDate
AND m1.Code = m2.Code
AND m1.Meter < m2.Meter
WHERE
m2.Account IS NULL
ORDER BY
m1.Account,
m1.StartDate
我唯一的问题 - 措辞暗示你可能希望 m1 和 m2 结果在有重复的地方都被删除?我不确定为什么这会有用,但这不是我要解决的问题。如果这真的是你想要的,
SELECT m1.account,
m1.meter,
m1.STARTDATE,
m1.ENDDATE,
m1.Code
FROM Meters m1
FULL JOIN Meters m2
ON m1.account = m2.account
AND m1.StartDate = m2.StartDate
AND m1.EndDate = m2.EndDate
AND m1.Code = m2.Code
AND NOT m1.Meter = m2.Meter
WHERE
m2.Account IS NULL
ORDER BY
m1.Account,
m1.StartDate
我觉得行吗?
推荐阅读
- swift - 如何将领域结果对象分配给变量。类类型
- r - 参数估计
- python - 了解 Tello Drone 的代码
- javascript - 一段时间后运行命令(js)
- html - 使用 CSS 的多个对象的剔除效果/剪辑路径
- c# - 语法错误 - 您的 SQL 语法有错误;检查在第 1 行的 '****' 附近使用的正确语法
- sql-server - SQL 语句登录 SQL Server 数据库
- excel - 如何在用户窗体文本框中设置计时器?
- android - Unity Oculus Android 构建失败。启动守护进程
- android - java.lang.IllegalStateException:指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()。(Android/Kotlin)