如何识别重复记录,其中没有记录具有NULL的特定字段

时间:2015-11-25 16:39:24

标签: duplicates

我有2张桌子([WY WC 2016更改TEMP]和[WC_JURIS_CODES])。我试图根据第一个表中的记录在第二个表中查找记录,但只记录第二个表中最新EFF_TO日期的记录,前提是该WC_CODE没有任何其他记录,其中EFF_TO = NULL。

我从这个SQL开始:

SELECT   OLD.[WC_CODE]
        ,OLD.[EFF_FROM]
        ,OLD.[EFF_TO]
FROM [WY WC 2016 Changes TEMP] NEW  --The SOURCE TABLE
INNER JOIN  [WC_JURIS_CODES] OLD on NEW.[WC_CODE] = OLD.[WC_CODE]
WHERE NEW.[Status] = 'N'  and (OLD.[JURIS_CODE] = 'WY' and OLD.[EFF_TO] is not NULL) or (OLD.[JURIS_CODE] = 'WY' and OLD.[EFF_TO] is NULL)
ORDER BY OLD.[WC_CODE], OLD.[EFF_FROM] 

这是回归:

WC_CODE EFF_FROM    EFF_TO
000010  04/01/2011  12/31/2011
000010  01/01/2012  12/31/2012
000010  01/01/2013  12/31/2013
000010  01/01/2014  12/31/2014
000010  01/01/2015  NULL
000020  04/01/2011  12/31/2011
000020  01/01/2012  12/31/2012
000020  01/01/2013  12/31/2013
000020  01/01/2014  12/31/2014
000030  04/01/2011  12/31/2011
000030  01/01/2012  12/31/2012
000030  01/01/2013  12/31/2013
000030  01/01/2014  12/31/2014

我只想看到这个结果:

WC_CODE EFF_FROM    EFF_TO
000020  01/01/2014  12/31/2014
000030  01/01/2014  12/31/2014

因为它没有WC_CODE ='000030'或'000020'的其他记录,其中EFF_TO为空,并且这些记录具有最新的(最近的)EFF_TO日期。

我尝试过UNIQUE,DISTINCT,但这些都没有用。我认为我需要识别重复项,然后将它们作为一个组进行查询。毫无头绪!任何帮助将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果删除括号,此查询将适用于mysql。您可能需要调整ms sql server。

  • 在内部查询中,找到每个EFF_FROM具有最大WC_CODE的行。
  • 在外部查询中,过滤这些结果以移除包含NULL EFF_TO值的行。

喜欢这个......

SELECT 
  CODES.[WC_CODE], CODES.[EFF_FROM], CODES.[EFF_TO]
FROM [WC_JURIS_CODES] CODES
INNER JOIN (

  -- build a derived/temporary table with the largest EFF_CODE for each WC_CODE
  -- run this query separately and tweak until it produces the result you want
  SELECT 
    OLD.[WC_CODE], MAX(OLD.[EFF_FROM]) AS MAX_EFF_FROM
  FROM [WY WC 2016 Changes TEMP] NEW
    INNER JOIN [WC_JURIS_CODES] OLD ON (NEW.[WC_CODE] = OLD.[WC_CODE])
  WHERE 
    -- adjust these as needed
    NEW.[Status] = 'N' 
    AND OLD.[JURIS_CODE] = 'WY'
  GROUP BY
    OLD.[WC_CODE]

-- join derived table to main table
) MAX_EFF_FROM ON (CODES.[WC_CODE] = MAX_EFF_FROM.[WC_CODE] AND CODES.[EFF_FROM] = MAX_EFF_FROM.[MAX_EFF_FROM])
-- and remove the NULLs
WHERE
  CODES.[EFF_TO] IS NOT NULL

限制/注意事项:

  • 内部查询获取最大EFF_FROM,因为看起来该值永远不会为空。
    • 如果您需要获取最高EFF_TONULL EFF_TO,您还需要确保最多可以有NULL {{} {1}}每EFF_TO
    • 如果这些记录中的日期范围可能重叠,则需要调整此方法。 (即:如果最大WC_CODE并不总是对应于最大EFF_FROM
  • EFF_TO应该是EFF_FROM的唯一值。如果不是,结果将是不可预测的。 (WC_CODE上的唯一索引如果可能的话,将是一个好主意。)