46
loading...
This website collects cookies to deliver better user experience
DbsNm.TblNm
with columns for:Category_A
, Category_B
& Category_C
but there could be one or more ;Src_From_Dt
and Src_Upto_Dt
Cat | From | Upto |
---|---|---|
Eric | 11 Feb 2007 | 27 Oct 2007 |
Eric | 28 Oct 2007 | 31 Dec 2009 |
28 Oct 2007
is the next day after 27 Oct 2007
these two records actually represent contiguous entries for Eric
Cat | From | Upto |
---|---|---|
Erin | 01 Apr 2007 | 30 Sep 2007 |
Erin | 01 Apr 2008 | 30 Sep 2008 |
Erin
wasn't registered for a period of 2007-2008 and there are 2 non-contiguous registrations.Cat | From | Upto |
---|---|---|
Erni | 01 Jan 2000 | 31 Dec 2003 |
Erni | 01 Jan 2004 | 31 Dec 2006 |
Erni | 01 Jab 2009 | 31 Dec 2020 |
GrpNum
- and then uses that for an overall summary of them and their boundary points in a final SELECT and GROUP BY.WITH
D AS (
SELECT
MAX( Src_From_Dt ) OVER (
PARTITION BY
Category_A ,
Category_B ,
Category_C
ORDER BY
Src_Upto_Dt ,
Src_From_Dt
ROWS BETWEEN
1 PRECEDING
AND
1 PRECEDING
) AS Prev_From_Dt , -- not used, here for inspections
MAX( Src_Upto_Dt ) OVER (
PARTITION BY
Category_A ,
Category_B ,
Category_C
ORDER BY
Src_Upto_Dt ,
Src_From_Dt
ROWS BETWEEN
1 PRECEDING
AND
1 PRECEDING
) AS Prev_Upto_Dt ,
A.*
FROM
DbsNm.TblNm AS A -- AS SrcTbl
) ,
E AS (
SELECT
CASE
WHEN
Prev_Upto_Dt IS NULL
OR
( Src_From_Dt - Prev_Upto_Dt ) IN ( 0, 1, 2, 3 ) THEN 'C' -- Continuous
ELSE 'D' -- Discontinuous
END AS Continuity ,
( --
ROW_NUMBER() OVER (
PARTITION BY
Category_A ,
Category_B ,
Category_C
ORDER BY
Src_From_Dt )
-
ROW_NUMBER() OVER (
PARTITION BY
Category_A ,
Category_B ,
Category_C ,
Continuity
ORDER BY
Src_From_Dt )
) AS GrpNum ,
D.*
FROM
D
) ,
F AS (
SELECT
Category_A ,
Category_B ,
Category_C ,
GrpNum ,
MIN( Src_From_Dt ) AS CntntyGrp_From_Dt ,
MAX( Src_Upto_Dt ) AS CntntyGrp_Upto_Dt , -- not used, here for inspections
COUNT(*) AS Rw_Cnt
FROM
E
GROUP BY
Category_A ,
Category_B ,
Category_C ,
GrpNum
) ,
G AS (
SELECT
Category_A ,
Category_B ,
Category_C ,
COUNT( DISTINCT CntntyGrp_From_Dt ) AS CntntyGrp_From_Dt_Ctd ,
COUNT(*) AS Rw_Cnt
FROM
F
GROUP BY
Category_A ,
Category_B ,
Category_C
)
SELECT
CntntyGrp_From_Dt_Ctd ,
MIN( Rw_Cnt ) AS Min_RwsPerSince ,
MAX( Rw_Cnt ) AS Max_RwsPerSince ,
COUNT(*) AS CategoryCombo_Cnt ,
MIN( Category_A ) AS Min_Category_A ,
MAX( Category_A ) AS Max_Category_A
FROM
G
GROUP BY
CntntyGrp_From_Dt_Ctd
ORDER BY
CategoryCombo_Cnt DESC ,
Max_RwsPerSince DESC
;