@@ -165,7 +165,7 @@ INSERT INTO ssd_development.ssd_version_log
165165 (version_number, release_date, description , is_current, created_by, impact_description)
166166VALUES
167167 -- insert & update for CURRENT version (using MAJOR.MINOR.PATCH)
168- (' 1.3.1 ' , ' 2025-10-03 ' , ' Coventry suggested on ssd_assessment_factors' , 1 , ' admin' , ' adjmts provided by Coventry to provide more robust pulling of assessment factor data where filter might not align with prev-family assessments- ' );
168+ (' 1.3.2 ' , ' 2025-11-10 ' , ' Block out string_agg on ssd_assessment_factors' , 1 , ' admin' , ' fix needed to prevent legacy sql failing on string_agg in modern selection block ' );
169169
170170
171171
@@ -191,7 +191,8 @@ VALUES
191191 (' 1.2.7' , ' 2025-09-10' , ' remove ssd_api_data_staging - now part of api release' , 0 , ' admin' , ' patch fix' ),
192192 (' 1.2.8' , ' 2025-09-13' , ' assessment_factors & cla_episodes refactor' , 0 , ' admin' , ' early adopters suggested patch fix' ),
193193 (' 1.2.9' , ' 2025-09-22' , ' assessment_factors refactor now with pre-aggr, fix pre-compile issue SQL <2016' , 0 , ' admin' , ' improved run time perf, ease of opt A/B toggle' ),
194- (' 1.3.0' , ' 2025-09-24' , ' New ssd_cohort for cohort visibility/monitoring' , 0 , ' admin' , ' provides breakdown of cohort origins - later use to ease current EXISTS backchecks on ssd_person' );
194+ (' 1.3.0' , ' 2025-09-24' , ' New ssd_cohort for cohort visibility/monitoring' , 0 , ' admin' , ' provides breakdown of cohort origins - later use to ease current EXISTS backchecks on ssd_person' ),
195+ (' 1.3.1' , ' 2025-10-03' , ' Coventry suggested on ssd_assessment_factors' , 0 , ' admin' , ' adjmts provided by Coventry to provide more robust pulling of assessment factor data where filter might not align with prev-family assessments-' );
195196
196197
197198-- META-ELEMENT: {"type": "test"}
@@ -399,10 +400,6 @@ CREATE NONCLUSTERED INDEX idx_ssd_person_ethnicity_gender ON ssd_developme
399400PRINT ' Table created: ' + @TableName;
400401
401402
402- /* SSD Person filter (notes): - Implemented*/
403- -- [done]contact in last 6yrs - HDM.Child_Social.FACT_CONTACTS.CONTACT_DTTM - -- might have only contact, not yet RFRL
404- -- [done] has open referral - FACT_REFERRALS.REFRL_START_DTTM or doesn't closed date or a closed date within last 6yrs
405- -- [picked up within the referral] active plan or has been active in 6yrs
406403
407404/* SSD Person filter (notes): - ON HOLD/Not included in SSD Ver/Iteration 1*/
408405-- 1
@@ -433,8 +430,10 @@ PRINT 'Table created: ' + @TableName;
433430-- Author: D2I
434431-- Version: 1.0
435432--
436- -- Status: [R]elease
437- -- Remarks: Provides stable join pattern everywhere, shift from ssd_person
433+ -- Status: [D]ev
434+ -- Remarks: This is an in dev table in order to better optimise the process of getting SSD cohort
435+ -- details into other related tables and help flag why they are included.
436+ -- Provides stable join pattern everywhere, shift from ssd_person
438437-- for WHERE EXISTS to reduce scan loads during ssd deployment. Provide
439438-- flags for record(s) source visibility.
440439-- Dependencies:
@@ -583,14 +582,14 @@ rollup AS (
583582INSERT ssd_development.ssd_cohort(
584583 dim_person_id, legacy_id,
585584 has_contact, has_referral, has_903, is_care_leaver, has_eligibility,
586- has_client, has_involvement, -- <<< NEW
585+ has_client, has_involvement,
587586 first_activity_dttm, last_activity_dttm
588587)
589588SELECT
590589 r.dim_person_id,
591590 MAX(dp.LEGACY_ID) AS legacy_id,
592591 r.has_contact, r.has_referral, r.has_903, r.is_care_leaver, r.has_eligibility,
593- r.has_client, r.has_involvement, -- <<< NEW
592+ r.has_client, r.has_involvement,
594593 r.first_activity_dttm, r.last_activity_dttm
595594FROM rollup AS r
596595LEFT JOIN __SRC__DIM_PERSON AS dp
@@ -2006,7 +2005,6 @@ CREATE TABLE ssd_development.ssd_assessment_factors (
20062005 - Legacy path: FOR XML PATH (SQL Server 2012+)
20072006 ======================================================================== */
20082007
2009- -- META-ELEMENT: {"type": "insert_data"}
20102008SET XACT_ABORT ON ;
20112009
20122010BEGIN TRY
@@ -2015,6 +2013,7 @@ BEGIN TRY
20152013 /* -------------------------------------------
20162014 Shared prep (raw filtered rows)
20172015 ------------------------------------------- */
2016+ IF OBJECT_ID (' tempdb..#ssd_TMP_PRE_assessment_factors' ,' U' ) IS NOT NULL DROP TABLE #ssd_TMP_PRE_assessment_factors;
20182017 SELECT
20192018 ffa .FACT_FORM_ID ,
20202019 ffa .ANSWER_NO ,
@@ -2043,6 +2042,7 @@ BEGIN TRY
20432042 /* -------------------------------------------
20442043 Compact codes table (de-dup + sort keys)
20452044 ------------------------------------------- */
2045+ IF OBJECT_ID (' tempdb..#ssd_d_codes' ,' U' ) IS NOT NULL DROP TABLE #ssd_d_codes;
20462046 SELECT DISTINCT
20472047 d .FACT_FORM_ID ,
20482048 d .ANSWER_NO ,
@@ -2058,104 +2058,55 @@ BEGIN TRY
20582058 INTO #ssd_d_codes
20592059 FROM #ssd_TMP_PRE_assessment_factors AS d;
20602060
2061- -- Optional index (IF your LA assessments row count is in the millions)
2061+ -- Optional index (IF your LA assessments row count is millions)
20622062 -- CREATE CLUSTERED INDEX IX_codes ON #ssd_d_codes(FACT_FORM_ID, num_part, alpha_part, ANSWER_NO) INCLUDE (ANSWER);
20632063
20642064 /* -------------------------------------------
2065- Path selection (prefer modern when available)
2065+ Legacy path: SQL Server 2012+
2066+ Build JSON via FOR XML PATH using ordered #ssd_d_codes
20662067 ------------------------------------------- */
2067- DECLARE @UseModern bit = 1 ; -- set to 0 force legacy everywhere
2068- DECLARE @ProductVersion nvarchar (32 ) = CONVERT (nvarchar (32 ), SERVERPROPERTY (' ProductVersion' ));
2069- DECLARE @Major int = TRY_CONVERT (int , PARSENAME (@ProductVersion, 4 )); -- 16=SQL 2022, 15=2019, 14=2017, 11=2012
2070-
2071- IF (@UseModern = 1 AND @Major >= 16 )
2072- BEGIN
2073- /* -------------------------------------------
2074- Modern path: SQL Server 2022+/Azure SQL
2075- Use STRING_AGG with ORDER BY over compact codes set
2076- ------------------------------------------- */
2077- INSERT INTO ssd_development .ssd_assessment_factors (
2078- cinf_table_id,
2079- cinf_assessment_id,
2080- cinf_assessment_factors_json
2081- )
2082- SELECT
2083- fsa .EXTERNAL_ID AS cinf_table_id,
2084- fsa .FACT_FORM_ID AS cinf_assessment_id,
2085-
2086- -- KEY-VALUES output {"1B": "Yes", "2B": "Yes", ...}
2087- N ' {' + STRING_AGG (
2088- CONCAT (' "' , c .ANSWER_NO , ' ": ' , QUOTENAME (c .ANSWER , ' "' )),
2089- N ' , '
2090- ) WITHIN GROUP (ORDER BY c .num_part , c .alpha_part )
2091- + N ' }' AS cinf_assessment_factors_json
2092-
2093- -- KEYS-ONLY alternative (swap with lines above if ["1A","2B",...] needed):
2094- -- N'[' + STRING_AGG(
2095- -- CONCAT('"', c.ANSWER_NO, '"'),
2096- -- N', '
2097- -- ) WITHIN GROUP (ORDER BY c.num_part, c.alpha_part)
2098- -- + N']' AS cinf_assessment_factors_json
2099-
2100-
2101-
2102- FROM HDM .Child_Social .FACT_SINGLE_ASSESSMENT AS fsa
2103- JOIN #ssd_d_codes AS c
2104- ON c .FACT_FORM_ID = fsa .FACT_FORM_ID
2105- WHERE fsa .EXTERNAL_ID <> - 1
2106- GROUP BY fsa .EXTERNAL_ID , fsa .FACT_FORM_ID ;
2107- -- Optional scope:
2108- -- AND fsa.FACT_FORM_ID IN (SELECT cina_assessment_id FROM ssd_development.ssd_cin_assessments)
2109- END
2110- ELSE
2111- BEGIN
2112- /* -------------------------------------------
2113- Legacy path: SQL Server 2012+
2114- Build JSON via FOR XML PATH using ordered #ssd_d_codes
2115- ------------------------------------------- */
2116- INSERT INTO ssd_development .ssd_assessment_factors (
2117- cinf_table_id,
2118- cinf_assessment_id,
2119- cinf_assessment_factors_json
2120- )
2121- SELECT
2122- fsa .EXTERNAL_ID AS cinf_table_id,
2123- fsa .FACT_FORM_ID AS cinf_assessment_id,
2124- (
2125- SELECT
2126- -- KEY-VALUES output {"1B": "Yes", "2B": "Yes", ...}
2127- ' {' +
2128- STUFF ((
2129- SELECT
2130- ' , "' + x .ANSWER_NO + ' ": ' + QUOTENAME (x .ANSWER , ' "' )
2131- FROM #ssd_d_codes AS x
2132- WHERE x .FACT_FORM_ID = fsa .FACT_FORM_ID
2133- ORDER BY x .num_part , x .alpha_part
2134- FOR XML PATH (' ' ), TYPE
2135- ).value (' .' , ' NVARCHAR(MAX)' ), 1 , 2 , ' ' ) +
2136- ' }'
2137-
2138- -- KEYS-ONLY alternative (swap with lines above if ["1A","2B",...] needed):
2139- -- '[' +
2140- -- STUFF((
2141- -- SELECT
2142- -- ', "' + x.ANSWER_NO + '"'
2143- -- FROM #ssd_d_codes AS x
2144- -- WHERE x.FACT_FORM_ID = fsa.FACT_FORM_ID
2145- -- ORDER BY x.num_part, x.alpha_part
2146- -- FOR XML PATH(''), TYPE
2147- -- ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
2148- -- + ']'
2149-
2150-
2151- ) AS cinf_assessment_factors_json
2152- FROM HDM .Child_Social .FACT_SINGLE_ASSESSMENT AS fsa
2153- JOIN (SELECT DISTINCT FACT_FORM_ID FROM #ssd_d_codes) AS d
2154- ON d .FACT_FORM_ID = fsa .FACT_FORM_ID
2155- WHERE fsa .EXTERNAL_ID <> - 1 ;
2156- -- Optional scope:
2157- -- AND fsa.FACT_FORM_ID IN (SELECT cina_assessment_id FROM ssd_development.ssd_cin_assessments)
2158- END
2068+ INSERT INTO ssd_development .ssd_assessment_factors (
2069+ cinf_table_id,
2070+ cinf_assessment_id,
2071+ cinf_assessment_factors_json
2072+ )
2073+ SELECT
2074+ fsa .EXTERNAL_ID AS cinf_table_id,
2075+ fsa .FACT_FORM_ID AS cinf_assessment_id,
2076+ (
2077+ SELECT
2078+ -- KEY-VALUES output {"1B": "Yes", "2B": "Yes", ...}
2079+ ' {' +
2080+ STUFF ((
2081+ SELECT
2082+ ' , "' + x .ANSWER_NO + ' ": ' + QUOTENAME (x .ANSWER , ' "' )
2083+ FROM #ssd_d_codes AS x
2084+ WHERE x .FACT_FORM_ID = fsa .FACT_FORM_ID
2085+ ORDER BY x .num_part , x .alpha_part
2086+ FOR XML PATH (' ' ), TYPE
2087+ ).value (' .' , ' NVARCHAR(MAX)' ), 1 , 2 , ' ' ) +
2088+ ' }'
2089+
2090+ -- Awaiting LA/DfE approval
2091+ -- KEYS-ONLY alternative (swap with lines above if ["1A","2B",...] needed):
2092+ -- '[' +
2093+ -- STUFF((
2094+ -- SELECT
2095+ -- ', "' + x.ANSWER_NO + '"'
2096+ -- FROM #ssd_d_codes AS x
2097+ -- WHERE x.FACT_FORM_ID = fsa.FACT_FORM_ID
2098+ -- ORDER BY x.num_part, x.alpha_part
2099+ -- FOR XML PATH(''), TYPE
2100+ -- ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
2101+ -- + ']'
2102+
2103+ ) AS cinf_assessment_factors_json
2104+ FROM HDM .Child_Social .FACT_SINGLE_ASSESSMENT AS fsa
2105+ JOIN (SELECT DISTINCT FACT_FORM_ID FROM #ssd_d_codes) AS d
2106+ ON d .FACT_FORM_ID = fsa .FACT_FORM_ID
2107+ WHERE fsa .EXTERNAL_ID <> - 1 ;
2108+ -- Optional scope:
2109+ -- AND fsa.FACT_FORM_ID IN (SELECT cina_assessment_id FROM ssd_development.ssd_cin_assessments)
21592110
21602111 COMMIT TRANSACTION ;
21612112END TRY
@@ -2168,6 +2119,42 @@ END CATCH;
21682119IF OBJECT_ID (' tempdb..#ssd_d_codes' ,' U' ) IS NOT NULL DROP TABLE #ssd_d_codes;
21692120IF OBJECT_ID (' tempdb..#ssd_TMP_PRE_assessment_factors' ,' U' ) IS NOT NULL DROP TABLE #ssd_TMP_PRE_assessment_factors;
21702121
2122+ -- -------------------------------------------------------------------------
2123+ -- Modern path: SQL Server 2022 or Azure SQL only
2124+ -- enable on modern servers, comment out legacy INSERT above and
2125+ -- uncomment this whole block
2126+ -- -------------------------------------------------------------------------
2127+ -- INSERT INTO ssd_development.ssd_assessment_factors (
2128+ -- cinf_table_id,
2129+ -- cinf_assessment_id,
2130+ -- cinf_assessment_factors_json
2131+ -- )
2132+ -- SELECT
2133+ -- fsa.EXTERNAL_ID AS cinf_table_id,
2134+ -- fsa.FACT_FORM_ID AS cinf_assessment_id,
2135+ --
2136+ -- -- KEY-VALUES output {"1B": "Yes", "2B": "Yes", ...}
2137+ -- N'{' + STRING_AGG(
2138+ -- CONCAT('"', c.ANSWER_NO, '": ', QUOTENAME(c.ANSWER, '"')),
2139+ -- N', '
2140+ -- ) WITHIN GROUP (ORDER BY c.num_part, c.alpha_part)
2141+ -- + N'}' AS cinf_assessment_factors_json
2142+ --
2143+ -- -- KEYS-ONLY alternative (swap with lines above if ["1A","2B",...] needed):
2144+ -- -- N'[' + STRING_AGG(
2145+ -- -- CONCAT('"', c.ANSWER_NO, '"'),
2146+ -- -- N', '
2147+ -- -- ) WITHIN GROUP (ORDER BY c.num_part, c.alpha_part)
2148+ -- -- + N']' AS cinf_assessment_factors_json
2149+ --
2150+ -- FROM HDM.Child_Social.FACT_SINGLE_ASSESSMENT AS fsa
2151+ -- JOIN #ssd_d_codes AS c
2152+ -- ON c.FACT_FORM_ID = fsa.FACT_FORM_ID
2153+ -- WHERE fsa.EXTERNAL_ID <> -1
2154+ -- GROUP BY fsa.EXTERNAL_ID, fsa.FACT_FORM_ID;
2155+ -- -- Optional scope:
2156+ -- -- AND fsa.FACT_FORM_ID IN (SELECT cina_assessment_id FROM ssd_development.ssd_cin_assessments)
2157+
21712158
21722159-- -- META-ELEMENT: {"type": "create_fk"}
21732160-- ALTER TABLE ssd_development.ssd_assessment_factors ADD CONSTRAINT FK_ssd_cinf_assessment_id
0 commit comments