筛选最大有效约会
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)
我有下面的查询,它让我的 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)