6868
6969BEGIN
7070 CREATE TABLE ssd_person (
71- pers_legacy_id NVARCHAR (48 ), -- metadata={"item_ref":"PERS014A"}
71+ pers_legacy_id NVARCHAR (48 ), -- metadata={"item_ref":"PERS014A", "info": "Legacy systems identifier. Common to SystemC"}
7272 pers_person_id NVARCHAR (48 ) PRIMARY KEY , -- metadata={"item_ref":"PERS001A"}
7373 pers_upn NVARCHAR (13 ), -- metadata={"item_ref":"PERS006A"}
7474 pers_forename NVARCHAR (100 ), -- metadata={"item_ref":"PERS015A"}
7575 pers_surname NVARCHAR (255 ), -- metadata={"item_ref":"PERS016A"}
76- pers_sex NVARCHAR (20 ), -- metadata={"item_ref":"PERS002A", "item_status":"P", "info":"If -additional- status to Gender is held, otherwise duplicate pers_gender"}
76+ pers_sex NVARCHAR (20 ), -- metadata={"item_ref":"PERS002A", "item_status":"P", "info":"If -additional- status to Gender is held, as used in stat-returns, otherwise duplicate pers_gender"}
7777 pers_gender NVARCHAR (10 ), -- metadata={"item_ref":"PERS003A", "item_status":"R", "expected_data":["unknown",NULL,"F","U","M","I"]}
7878 pers_ethnicity NVARCHAR (48 ), -- metadata={"item_ref":"PERS004A", "expected_data":[NULL, tbc]}
7979 pers_dob DATETIME , -- metadata={"item_ref":"PERS005A", "info": "SSD dat values render as 2024-12-10 00:00:00.000"}
@@ -87,75 +87,56 @@ BEGIN
8787 );
8888END
8989
90- -- CTE to get a no_upn_code
91- -- (assumption here is that all codes will be the same/current)
90+ -- CTE to get no_upn_code
9291;WITH f903_data_CTE AS (
9392 SELECT
94- -- get the most recent no_upn_code if exists
93+ -- get most recent no_upn_code if exists
9594 dim_person_id,
9695 no_upn_code,
9796 ROW_NUMBER () OVER (PARTITION BY dim_person_id ORDER BY no_upn_code DESC ) AS rn
9897 FROM
9998 HDM .Child_Social .fact_903_data
10099 WHERE
101- no_upn_code IS NOT NULL -- sparse data in this field, filter for performance
102- )
103- INSERT INTO ssd_person (
104- pers_legacy_id,
105- pers_person_id,
106- pers_upn,
107- pers_forename,
108- pers_surname,
109- pers_sex, -- as used in stat-returns
110- pers_gender, -- Placeholder for those LAs that store sex and gender independently
111- pers_ethnicity,
112- pers_dob,
113- pers_single_unique_id,
114- pers_upn_unknown,
115- pers_send_flag,
116- pers_expected_dob,
117- pers_death_date,
118- pers_is_mother,
119- pers_nationality
120-
100+ no_upn_code IS NOT NULL -- possible sparse data, filter for performance
121101)
102+ INSERT INTO ssd_person
122103SELECT
123- -- TOP 100 -- Limit returned rows to speed up run-time tests [TESTING|LA DEBUG]
124- p .LEGACY_ID ,
125- CAST (p .DIM_PERSON_ID AS NVARCHAR (48 )), -- Ensure DIM_PERSON_ID is cast to NVARCHAR(48)
126- LEFT (LTRIM (RTRIM (p .UPN )), 13 ), -- Coerce data to expected 13+strip, to avoid downstream fallover
127- p .FORENAME ,
128- p .SURNAME ,
129- p .GENDER_MAIN_CODE AS pers_sex, -- Sex/Gender as used in stat-returns
130- p .GENDER_MAIN_CODE , -- Placeholder for those LAs that store sex and gender independently
131- dlde .NAT_ID , -- COV change to align with national ID was LEFT(p.ETHNICITY_MAIN_CODE, 4) [REVIEW]
104+ -- TOP 100 -- [TESTING|LA DEBUG]
105+ p .LEGACY_ID , -- pers_legacy_id -- Common SystemC internal ID
106+ CAST (p .DIM_PERSON_ID AS NVARCHAR (48 )), -- pers_person_id -- Ensure DIM_PERSON_ID is cast to NVARCHAR(48)
107+ LEFT (LTRIM (RTRIM (p .UPN )), 13 ), -- pers_upn -- Coerce data to expected 13+strip, to avoid downstream fallover
108+ p .FORENAME , -- pers_forename
109+ p .SURNAME , -- pers_surname
110+ p .GENDER_MAIN_CODE , -- pers_sex -- Sex/Gender as used in stat-returns
111+ p .GENDER_MAIN_CODE , -- pers_gender -- Placeholder for those LAs that store sex and gender independently
112+ dlde .NAT_ID , -- pers_ethnicity -- COV change to align with national ID was LEFT(p.ETHNICITY_MAIN_CODE, 4) [REVIEW]
132113 CASE WHEN (p .DOB_ESTIMATED ) = ' N'
133- THEN p .BIRTH_DTTM -- Set to BIRTH_DTTM when DOB_ESTIMATED = 'N'
114+ THEN p .BIRTH_DTTM -- pers_dob -- Set to BIRTH_DTTM when DOB_ESTIMATED = 'N'
134115 ELSE NULL -- or NULL
135116 END ,
136- NULL AS pers_single_unique_id, -- Set to NULL as default(dev) / or set to NHS num / or set to Single Unique Identifier(SUI)
137- f903 .NO_UPN_CODE AS pers_upn_unknown, -- Source of upn_unknown likely to vary between LAs [REVIEW]
138- p .EHM_SEN_FLAG ,
117+ NULL AS pers_single_unique_id, -- pers_single_unique_id -- Set to NULL as default(dev) / or set to NHS num / or set to Single Unique Identifier(SUI)
118+ f903 .NO_UPN_CODE AS pers_upn_unknown, -- pers_upn_unknown -- Source of upn_unknown likely to vary between LAs [REVIEW]
119+ p .EHM_SEN_FLAG , -- pers_send_flag
139120 CASE WHEN (p .DOB_ESTIMATED ) = ' Y'
140- THEN p .BIRTH_DTTM -- Set to BIRTH_DTTM when DOB_ESTIMATED = 'Y'
121+ THEN p .BIRTH_DTTM -- pers_expected_dob -- Set to BIRTH_DTTM when DOB_ESTIMATED = 'Y'
141122 ELSE NULL -- or NULL
142123 END ,
143- p .DEATH_DTTM ,
124+ p .DEATH_DTTM , -- pers_death_date
144125 CASE
145- WHEN p .GENDER_MAIN_CODE <> ' M' AND -- Assumption that if male is not mother
126+ WHEN p .GENDER_MAIN_CODE <> ' M' AND -- Assumption that if male is not mother
146127 EXISTS (SELECT 1 FROM HDM .Child_Social .FACT_PERSON_RELATION fpr
147128 WHERE fpr .DIM_PERSON_ID = p .DIM_PERSON_ID AND
148- fpr .DIM_LOOKUP_RELTN_TYPE_CODE = ' CHI' ) -- check for child relation only
129+ fpr .DIM_LOOKUP_RELTN_TYPE_CODE = ' CHI' ) -- check for child relation only
149130 THEN ' Y'
150- ELSE NULL -- No child relation found
151- END ,
152- p .NATNL_CODE -- [REVIEW] LEFT(p.NATNL_CODE, 2)
131+ ELSE NULL -- or no child relation found
132+ END , -- pers_is_mother
133+ p .NATNL_CODE -- pers_nationality -- [REVIEW] LEFT(p.NATNL_CODE, 2)
153134FROM
154135 HDM .Child_Social .DIM_PERSON AS p
155136
156137-- [TESTING] 903 table refresh only in reporting period?
157138LEFT JOIN (
158- -- ??other accessible location for NO_UPN data than 903 table?? -- [TESTING|LA DEBUG]
139+ -- [REVIEW|LA DEBUG] - accessible location for NO_UPN data other than 903 table?
159140 SELECT
160141 dim_person_id,
161142 no_upn_code
@@ -171,78 +152,126 @@ LEFT JOIN
171152 -- align with national ID
172153 HDM .Child_Social .DIM_LOOKUP_DFE_ETHNIC dlde
173154 ON p .ETHNICITY_MAIN_CODE = dlde .MAIN_CODE
174-
175- WHERE
155+ WHERE
176156 /* EXCLUSIONS */
177157
178- -- p.DIM_PERSON_ID IN (1, 2, 3) AND -- -- hard filter on CMS person ids for LA reduced tiny cohort testing
158+ -- p.DIM_PERSON_ID IN (1, 2, 3) -- hard filter for tiny cohort LA testing [TESTING|DEBUG]
179159
180160 p .DIM_PERSON_ID IS NOT NULL
181161 AND p .DIM_PERSON_ID <> - 1
182- -- AND YEAR( p.BIRTH_DTTM) != 1900 -- Remove admin records hard-filter -- #DtoI-1814
162+ -- AND p.BIRTH_DTTM < DATEADD(Y, -100, GETDATE()) -- hard-filter possible 1900 yr admin records -- #DtoI-1814
183163
184164 /* INCLUSIONS */
165+
166+ -- /* Optional flags (uncomment to enable|disable) */
185167 AND (
186- p .IS_CLIENT = ' Y'
187-
188- OR (
189- -- Contacts in SSD window
190- EXISTS (
191- SELECT 1
192- FROM HDM .Child_Social .FACT_CONTACTS fc
193- WHERE fc .DIM_PERSON_ID = p .DIM_PERSON_ID
194- AND fc .CONTACT_DTTM >= @ssd_window_start
195- -- Optional upper bound, if needing a closed window
196- -- AND fc.CONTACT_DTTM < DATEADD(day, 1, @ssd_window_end)
197- )
198-
199- -- Referrals that touch the SSD window
200- OR EXISTS (
201- SELECT 1
202- FROM HDM .Child_Social .FACT_REFERRALS fr
203- WHERE fr .DIM_PERSON_ID = p .DIM_PERSON_ID
204- AND (
205- fr .REFRL_START_DTTM >= @ssd_window_start
206- OR fr .REFRL_END_DTTM >= @ssd_window_start
207- OR fr .REFRL_END_DTTM IS NULL
208- )
209- )
210-
211- -- Care leaver in touch in SSD window
212- OR EXISTS (
213- SELECT 1
214- FROM HDM .Child_Social .FACT_CLA_CARE_LEAVERS fccl
215- WHERE fccl .DIM_PERSON_ID = p .DIM_PERSON_ID
216- AND fccl .IN_TOUCH_DTTM >= @ssd_window_start
217- -- Optional upper bound
218- -- AND fccl.IN_TOUCH_DTTM < DATEADD(day, 1, @ssd_window_end)
219- )
220-
221- -- Eligibility flag
222- OR EXISTS (
223- SELECT 1
224- FROM HDM .Child_Social .DIM_CLA_ELIGIBILITY dce
225- WHERE dce .DIM_PERSON_ID = p .DIM_PERSON_ID
226- AND dce .DIM_LOOKUP_ELIGIBILITY_STATUS_DESC IS NOT NULL
227- )
228-
229- -- Involvements
230- OR EXISTS (
231- SELECT 1
232- FROM HDM .Child_Social .FACT_INVOLVEMENTS fi
233- WHERE (fi .DIM_PERSON_ID = p .DIM_PERSON_ID
234- AND (fi .DIM_LOOKUP_INVOLVEMENT_TYPE_CODE NOT LIKE ' KA%' -- Key Agencies (External)
235- OR fi .DIM_LOOKUP_INVOLVEMENT_TYPE_CODE IS NOT NULL
236- OR fi .IS_ALLOCATED_CW_FLAG = ' Y' )
237- -- AND START_DTTM > '2009-12-04 00:54:49.947' -- #DtoI-1830 care leavers who were aged 22-25 and may not have had Allocated Case Worker relationship for years+
238- AND DIM_WORKER_ID <> ' -1'
239-
240- AND (fi .END_DTTM IS NULL OR fi .END_DTTM > @ssd_window_start))
241- )
168+ p .IS_CLIENT = ' Y' -- Toggle as might not apply to all SystemC LAs [REVIEW]
169+ -- OR p.IS_FOSTER = 'Y'
170+ -- OR p.WAS_FOSTER = 'Y'
171+ -- OR p.IS_ADOPTOR = 'Y'
172+ -- OR p.WAS_ADOPTOR = 'Y'
173+ )
174+
175+
176+ AND (
177+ -- Contacts in SSD window
178+ EXISTS (
179+ SELECT 1
180+ FROM HDM .Child_Social .FACT_CONTACTS fc
181+ WHERE fc .DIM_PERSON_ID = p .DIM_PERSON_ID
182+ AND fc .CONTACT_DTTM >= @ssd_window_start
183+ -- Optional upper bound, if needing a closed window
184+ AND fc .CONTACT_DTTM < DATEADD (day , 1 , @ssd_window_end)
185+ )
186+
187+ -- Referrals that touch the SSD window
188+ OR EXISTS (
189+ SELECT 1
190+ FROM HDM .Child_Social .FACT_REFERRALS fr
191+ WHERE fr .DIM_PERSON_ID = p .DIM_PERSON_ID
192+ AND (
193+ fr .REFRL_START_DTTM >= @ssd_window_start
194+ OR fr .REFRL_END_DTTM >= @ssd_window_start
195+ OR fr .REFRL_END_DTTM IS NULL
196+ )
242197 )
198+
199+ -- Care leaver in touch in SSD window
200+ OR EXISTS (
201+ SELECT 1
202+ FROM HDM .Child_Social .FACT_CLA_CARE_LEAVERS fccl
203+ WHERE fccl .DIM_PERSON_ID = p .DIM_PERSON_ID
204+ AND fccl .IN_TOUCH_DTTM >= @ssd_window_start
205+ -- Optional upper bound
206+ -- AND fccl.IN_TOUCH_DTTM < DATEADD(day, 1, @ssd_window_end)
207+ )
208+
209+ -- Eligibility flag
210+ OR EXISTS (
211+ SELECT 1
212+ FROM HDM .Child_Social .DIM_CLA_ELIGIBILITY dce
213+ WHERE dce .DIM_PERSON_ID = p .DIM_PERSON_ID
214+ AND dce .DIM_LOOKUP_ELIGIBILITY_STATUS_DESC IS NOT NULL
215+ )
216+
217+ -- Involvements
218+ OR EXISTS (
219+ SELECT 1
220+ FROM HDM .Child_Social .FACT_INVOLVEMENTS fi
221+ WHERE fi .DIM_PERSON_ID = p .DIM_PERSON_ID
222+
223+ -- exclude Key Agency (KA%) involvements unless allocated CW
224+ AND NOT (
225+ COALESCE (fi .DIM_LOOKUP_INVOLVEMENT_TYPE_CODE , ' ' ) LIKE ' KA%'
226+ AND COALESCE (fi .IS_ALLOCATED_CW_FLAG , ' N' ) <> ' Y'
227+ )
228+
229+ -- AND fi.START_DTTM > '2009-12-04 00:54:49.947' -- #DtoI-1830 care leavers who were aged 22-25 and may not have had Allocated Case Worker relationship for years+
230+ AND fi .DIM_WORKER_ID <> ' -1'
231+ AND (fi .END_DTTM IS NULL OR fi .END_DTTM > @ssd_window_start)
232+ )
233+
234+ /* --------------------------------------------------------------------
235+ Potential optional inclusions (comment out by default)
236+ Reference as filters that also apply to such as DfE EA API cohort
237+
238+ IMPORTANT: Tables|data might not exist in some LAs
239+ -------------------------------------------------------------------- */
240+
241+ -- OR EXISTS ( -- [OPTIONAL] Early Help contacts
242+ -- SELECT 1
243+ -- FROM HDM.Child_Social.FACT_EHM_CONTACT ehc
244+ -- WHERE ehc.DIM_PERSON_ID = p.DIM_PERSON_ID
245+ -- AND ehc.CONTACT_DTTM >= @ssd_window_start
246+ -- -- Optional upper bound
247+ -- -- AND ehc.CONTACT_DTTM < DATEADD(day, 1, @ssd_window_end)
248+ -- )
249+
250+ -- OR EXISTS ( -- [OPTIONAL] CAF episodes
251+ -- SELECT 1
252+ -- FROM HDM.Child_Social.FACT_CAF_EPISODE caf
253+ -- WHERE caf.DIM_PERSON_ID = p.DIM_PERSON_ID
254+ -- AND (
255+ -- caf.EPISODE_START_DTTM >= @ssd_window_start
256+ -- OR caf.EPISODE_END_DTTM >= @ssd_window_start
257+ -- OR caf.EPISODE_END_DTTM IS NULL
258+ -- )
259+ -- )
260+
261+ -- OR EXISTS ( -- [OPTIONAL] Workspace
262+ -- SELECT 1
263+ -- FROM HDM.Child_Social.FACT_WORKSPACE fw
264+ -- WHERE fw.DIM_PERSON_ID = p.DIM_PERSON_ID
265+ -- AND (
266+ -- fw.START_DTTM >= @ssd_window_start
267+ -- OR fw.END_DTTM >= @ssd_window_start
268+ -- OR fw.END_DTTM IS NULL
269+ -- )
270+ -- )
243271 );
244272
245273
274+
246275-- -- META-ELEMENT: {"type": "create_idx"}
247276-- CREATE NONCLUSTERED INDEX IX_ssd_person_pers_dob ON ssd_person(pers_dob);
248277-- CREATE NONCLUSTERED INDEX IX_ssd_person_pers_common_child_id ON ssd_person(pers_common_child_id);
0 commit comments