筛选最大有效约会

Filter for max effective dating

我有下面的查询,它让我的 EMPLID 至少有两行 COVERAGE_ELECT = 'E' 并且计划类型为 49。

WITH Coverage_CTE (EMPLID, COVERAGE_ELECT)
 AS
  (
  SELECT EMPLID, COUNT(COVERAGE_ELECT) 
  FROM PS_SAVINGS_PLAN
  WHERE COVERAGE_ELECT = 'E'
  AND PLAN_TYPE = '49'
  GROUP BY EMPLID
  HAVING COUNT(COVERAGE_ELECT) > 1 
  )
, Emp_CTE (EMPLID)
AS
(
  select distinct EMPLID from Coverage_CTE
)
  SELECT SP.EMPLID, SP.PLAN_TYPE, SP.EFFDT, SP.COVERAGE_ELECT, SP.SAVINGS_COVRG, SP.FLAT_DED_AMT, SP.PCT_GROSS
  FROM PS_SAVINGS_PLAN as SP
  WHERE SP.EMPLID IN (Select EMPLID from Emp_CTE)
  AND SP.COVERAGE_ELECT = 'E'
  AND PLAN_TYPE = '49'

这似乎工作正常,但我想进一步过滤结果,只包括没有 EMPLID 行且生效日期大于最大 [=上面选择的 'E' 行中的 14=] 是 一个 'W' 或一个 'T'.

上面的查询当前有 EMPLID 5423H 的行(因为您看到的这个人有超过 1 COVERAGE_ELECT = 'E' 行 (3))。但是你看到这个人有两行 COVERAGE_ELECT 等于 T 和 W EFFDT 大于最大 EFFDT 'E' 行的生效日期(2018- 10-01).

EMPLID      PLAN_TYPE    EFFDT         COVERAGE_ELECT
5423H       49           2013-01-01    W
5423H       49           2015-10-02    E
5423H       49           2015-10-09    T
5423H       49           2016-09-29    E
5423H       49           2018-10-01    E
5423H       49           2018-10-07    T
5423H       49           2018-11-14    W

所以你在这个例子中看到了两种情况 - 1. 这个 EMPLID 有一行 'T' 大于 (2018-10-07) 最大 EFFDT 'E' 行 (2018 -10-01) 和 2。他们有一行 'W' 大于 (2018-11-14) 最大 EFFDT 'E' 行。如果这些情况中的任何一个为真,那么我不希望它们导致我上面的查询。我希望将此附加逻辑构建到上述查询中。我希望这是有道理的..

全部未测试 我会更改您的 CTE 以包括最大 effdt,为最大 WT EFFDATE 添加另一个 CTE,然后选择您最喜欢的方法从另一个中排除一个。

LEFT JOIN 和 WHERE null:

;WITH Coverage_CTE (EMPLID, COVERAGE_ELECT, MAXEFFDT)
AS (
    SELECT EMPLID, COUNT(COVERAGE_ELECT), MAX(EFFDT) MAXEFFDT
    FROM PS_SAVINGS_PLAN
    WHERE COVERAGE_ELECT = 'E'
       AND PLAN_TYPE = '49'
    GROUP BY EMPLID
    HAVING COUNT(COVERAGE_ELECT) > 1 
)
, WT_Coverage_CTE (EMPLID, WTMAXEFFDT)
As (
   SELECT EMPLID, MAX(EFFDT) WTMAXEFFDT
   FROM PS_SAVINGS_PLAN
    WHERE COVERAGE_ELECT IN ('W', 'T')
       AND PLAN_TYPE = '49'
    GROUP BY EMPLID
)

SELECT SP.EMPLID, SP.PLAN_TYPE, SP.EFFDT, SP.COVERAGE_ELECT, 
SP.SAVINGS_COVRG, 
       SP.FLAT_DED_AMT, SP.PCT_GROSS
    FROM PS_SAVINGS_PLAN as SP
INNER JOIN Coverage_CTE CCTE on CCTE.EMPLID = SP.EMPLID
LEFT OUTER JOIN WT_Coverage_CTE WTCTE
   on WTCTE.EMPLID = CCTE.EMPLID
   and WTCTE.WTMAXEFFDT > CCTE.MAXEFFDT
WHERE SP.COVERAGE_ELECT = 'E'
   AND PLAN_TYPE = '49'
   AND WTCTE.EMPLID is null

不存在:

;WITH Coverage_CTE (EMPLID, COVERAGE_ELECT, MAXEFFDT)
AS (
    SELECT EMPLID, COUNT(COVERAGE_ELECT), MAX(EFFDT) MAXEFFDT
    FROM PS_SAVINGS_PLAN
    WHERE COVERAGE_ELECT = 'E'
       AND PLAN_TYPE = '49'
    GROUP BY EMPLID
    HAVING COUNT(COVERAGE_ELECT) > 1 
)
, WT_Coverage_CTE (EMPLID, WTMAXEFFDT)
As (
   SELECT EMPLID, MAX(EFFDT) WTMAXEFFDT
   FROM PS_SAVINGS_PLAN
    WHERE COVERAGE_ELECT IN ('W', 'T')
       AND PLAN_TYPE = '49'
    GROUP BY EMPLID
)

SELECT SP.EMPLID, SP.PLAN_TYPE, SP.EFFDT, SP.COVERAGE_ELECT, SP.SAVINGS_COVRG, 
   SP.FLAT_DED_AMT, SP.PCT_GROSS
FROM PS_SAVINGS_PLAN as SP
INNER JOIN Coverage_CTE CCTE on CCTE.EMPLID = SP.EMPLID
WHERE SP.COVERAGE_ELECT = 'E'
   AND PLAN_TYPE = '49'
   AND NOT EXISTS (SELECT EMPLID
                   FROM WT_Coverage_CTE WTCTE
                   WHERE WTCTE.EMPLID = CCTE.EMPLID
                      AND WTCTE.WTMAXEFFDT > CCTE.MAXEFFDT
                   )

不在:

;WITH Coverage_CTE (EMPLID, COVERAGE_ELECT, MAXEFFDT)
AS (
    SELECT EMPLID, COUNT(COVERAGE_ELECT), MAX(EFFDT) MAXEFFDT
    FROM PS_SAVINGS_PLAN
    WHERE COVERAGE_ELECT = 'E'
       AND PLAN_TYPE = '49'
    GROUP BY EMPLID
    HAVING COUNT(COVERAGE_ELECT) > 1 
)
, WT_Coverage_CTE (EMPLID, WTMAXEFFDT)
As (
   SELECT EMPLID, MAX(EFFDT) WTMAXEFFDT
   FROM PS_SAVINGS_PLAN
    WHERE COVERAGE_ELECT IN ('W', 'T')
       AND PLAN_TYPE = '49'
    GROUP BY EMPLID
)

SELECT SP.EMPLID, SP.PLAN_TYPE, SP.EFFDT, SP.COVERAGE_ELECT, SP.SAVINGS_COVRG, 
   SP.FLAT_DED_AMT, SP.PCT_GROSS
FROM PS_SAVINGS_PLAN as SP
INNER JOIN Coverage_CTE CCTE on CCTE.EMPLID = SP.EMPLID
WHERE SP.COVERAGE_ELECT = 'E'
   AND PLAN_TYPE = '49'
   AND CCTE.EMPLID NOT IN (SELECT EMPLID
                           FROM WT_Coverage_CTE WTCTE
                           WHERE WTCTE.EMPLID = CCTE.EMPLID
                           AND WTCTE.WTMAXEFFDT > CCTE.MAXEFFDT
                          )

我使用的数据:

declare @PS_SAVINGS_PLAN table (emplid varchar(8), plan_type int,
                      effdt date, coverage_elect varchar(1))

insert into @ps_savings_plan
values
      ('5423H', 49, '2013-01-01', 'W'),
      ('5423H', 49, '2015-10-02', 'E'),
      ('5423H', 49, '2015-10-09', 'T'),
      ('5423H', 49, '2016-09-29', 'E'),
      ('5423H', 49, '2018-10-01', 'E'),
      ('5423H', 49, '2018-10-07', 'T'),
      ('5423n', 49, '2018-10-07', 'E'),
      ('5423n', 49, '2018-10-08', 'E'),
      ('5423H', 49, '2018-11-14', 'W')

根据您的叙述,这可以基于简单的条件聚合来回答:

WITH Coverage_CTE AS
 (
   SELECT EMPLID 
     ,Count(CASE WHEN COVERAGE_ELECT IN ('E') THEN effdt end) AS cntE
     ,Max(CASE WHEN COVERAGE_ELECT IN ('T', 'W') THEN effdt end) AS maxT
     ,Max(CASE WHEN COVERAGE_ELECT IN ('E') THEN effdt end) AS maxE

   FROM @PS_SAVINGS_PLAN
   WHERE PLAN_TYPE = '49'
   GROUP BY EMPLID
 )
SELECT EMPLID FROM Coverage_CTE
WHERE 
   -- at least two rows with COVERAGE_ELECT = 'E'       
   cntE > 1

   -- where there isn't a row for the EMPLID with an effective date that is greater
   -- than the max EFFDT of the 'E' rows selected above that is either a 'W' or a 'T'
  AND (maxT < maxE OR maxT IS NULL)