11-- Pckgd
22-- Title: Active Records Over Time
3- -- Description: Tracks the number of active records per year based on 2025 definition of active.
3+ -- Description: Tracks the number of active records per year based on CURRENT definition of active.
44-- Updates from: GitHub/TenthPres/TouchPointScripts/ActiveRecordsOverTime.sql
55-- Author: James at Tenth
66
7+ WITH FirstActivity AS (
8+ SELECT MIN (ActivityDate) AS FirstDate
9+ FROM (
10+ SELECT MIN (ContributionDate) AS ActivityDate
11+ FROM dbo .Contribution
712
8- WITH FamiliesGiving AS (SELECT YEAR(cc .ContributionDate ) AS ActivityYear, p .FamilyId
9- FROM dbo .Contribution cc WITH (NOLOCK)
10- JOIN dbo .People p WITH (NOLOCK) ON p .PeopleId = cc .PeopleId
11- WHERE cc .ContributionTypeId IN (1 , 5 , 8 , 9 , 10 , 20 )
12- AND p .IsDeceased = 0
13- GROUP BY YEAR(cc .ContributionDate ), p .FamilyId
14- HAVING COUNT (* ) >= 1 ),
15- PeopleFromGiving AS (SELECT fg .ActivityYear , p .PeopleId
16- FROM FamiliesGiving fg
17- JOIN dbo .People p WITH (NOLOCK) ON p .FamilyId = fg .FamilyId
18- WHERE p .IsDeceased = 0 ),
19- Attenders AS (SELECT YEAR(a .MeetingDate ) AS ActivityYear, a .PeopleId
20- FROM dbo .Attend a WITH (NOLOCK)
21- JOIN dbo .People p WITH (NOLOCK) ON p .PeopleId = a .PeopleId
22- WHERE a .AttendanceFlag = 1
23- AND p .IsDeceased = 0
24- GROUP BY YEAR(a .MeetingDate ), a .PeopleId
25- HAVING COUNT (* ) >= 2 ),
26- LegacyRegCount AS (SELECT YEAR(rd .Stamp ) AS ActivityYear, rd .UserPeopleId AS PeopleId, COUNT (* ) AS rCount
27- FROM dbo .RegistrationData rd WITH (NOLOCK)
28- JOIN dbo .People p WITH (NOLOCK) ON rd .UserPeopleId = p .PeopleId
29- WHERE rd .UserPeopleId IS NOT NULL
30- AND rd .Completed = 1
31- AND p .IsDeceased = 0
32- GROUP BY YEAR(rd .Stamp ), rd .UserPeopleId ),
33- FormsRegCount AS (SELECT YEAR(rp .CompletedDate ) AS ActivityYear, rp .PeopleId , COUNT (* ) AS rCount
34- FROM dbo .RegPeople rp WITH (NOLOCK)
35- JOIN dbo .People p WITH (NOLOCK) ON rp .PeopleId = p .PeopleId
36- WHERE rp .PeopleId IS NOT NULL
37- AND rp.[Status] = 2
38- AND p .IsDeceased = 0
39- GROUP BY YEAR(rp .CompletedDate ), rp .PeopleId ),
40- RegistrationCount AS (SELECT ActivityYear, PeopleId, SUM (rCount) AS rCount
41- FROM (SELECT ActivityYear, PeopleId, rCount
42- FROM LegacyRegCount
43- UNION ALL
44- SELECT ActivityYear, PeopleId, rCount
45- FROM FormsRegCount) r
46- GROUP BY ActivityYear, PeopleId),
47- Registrants AS (SELECT ActivityYear, PeopleId
48- FROM RegistrationCount
49- WHERE rCount >= 2 ),
50- PPL AS (SELECT ActivityYear, PeopleId
51- FROM PeopleFromGiving
52- UNION ALL
53- SELECT ActivityYear, PeopleId
54- FROM Attenders
55- UNION ALL
56- SELECT ActivityYear, PeopleId
57- FROM Registrants),
58- DistinctPPL AS (SELECT ActivityYear, PeopleId
59- FROM PPL
60- GROUP BY ActivityYear, PeopleId)
61- SELECT ActivityYear, COUNT (* ) AS ActiveCount
62- FROM DistinctPPL
63- GROUP BY ActivityYear
64- ORDER BY ActivityYear DESC
13+ UNION ALL
14+
15+ SELECT MIN (MeetingDate)
16+ FROM dbo .Attend
17+
18+ UNION ALL
19+
20+ SELECT MIN (Stamp)
21+ FROM dbo .RegistrationData
22+
23+ UNION ALL
24+
25+ SELECT MIN (CompletedDate)
26+ FROM dbo .RegPeople
27+ ) x
28+ ),
29+ Years AS (
30+ SELECT YEAR(FirstDate) AS ActivityYear
31+ FROM FirstActivity
32+
33+ UNION ALL
34+
35+ SELECT ActivityYear + 1
36+ FROM Years
37+ WHERE ActivityYear + 1 <= YEAR(GETDATE())
38+ )
39+ SELECT
40+ y .ActivityYear ,
41+ DATEFROMPARTS(y .ActivityYear , 12 , 31 ) AS AsOfDate,
42+ COUNT (ar .PeopleId ) AS ActiveCount
43+ FROM Years y
44+ CROSS APPLY dbo .ActiveRecords (
45+ DATEFROMPARTS(y .ActivityYear , 12 , 31 )
46+ ) ar
47+ GROUP BY
48+ y .ActivityYear
49+ ORDER BY
50+ y .ActivityYear DESC
51+ OPTION (MAXRECURSION 0 );
0 commit comments