首页 > 解决方案 > 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

如何重写查询以仅获取具有不同开始日期、结束日期和代码的记录?

标签: sql-server

解决方案


这会达到你的意思吗?

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

我觉得行吗?

http://sqlfiddle.com/#!18/289704/4


推荐阅读