Advertisement
Guest User

Untitled

a guest
Apr 7th, 2018
447
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 2.56 KB | None | 0 0
  1. --BEGIN DATA SETUP
  2. SET NOCOUNT ON;
  3. SET STATISTICS IO, TIME OFF;
  4. GO
  5.  
  6. DROP TABLE IF EXISTS Memberships
  7. DROP TABLE IF EXISTS DIM_DATE
  8.  
  9.  
  10. CREATE TABLE Memberships
  11.   (
  12.      [MembershipId]  INT IDENTITY PRIMARY KEY,
  13.      [ValidFromDate] DATETIME,
  14.      [ValidToDate]   DATETIME,
  15.      CHECK ([ValidToDate] >= [ValidFromDate])
  16.   );
  17.  
  18.  
  19. WITH Nums AS
  20. (
  21. SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY @@SPID) - 1 AS Number
  22. FROM master..spt_values v1, master..spt_values v2
  23. )
  24. INSERT INTO Memberships
  25.             ([ValidFromDate],
  26.              [ValidToDate])
  27.  
  28. SELECT DATEADD(DAY, N1.Number, '1997-01-01'),
  29.        DATEADD(DAY, N1.Number + CRYPT_GEN_RANDOM(3)% 7500, '1997-01-01')
  30. FROM Nums N1
  31. CROSS JOIN Nums N2
  32. WHERE N1.Number < 8000 AND N2.Number < 400
  33. ORDER BY N1.Number
  34.  
  35. ---Also evaluate the reverse index of this - I'm assuming ignoring expired members will
  36. --generally be more useful
  37. CREATE INDEX ix ON Memberships (ValidToDate) include([ValidFromDate]);
  38.  
  39. CREATE TABLE DIM_DATE (DateKey DATE PRIMARY KEY);
  40.  
  41. WITH CTE_DATE
  42. AS (SELECT CAST('1997-01-01' AS DATE) AS DateKey
  43.          UNION ALL
  44.          SELECT DATEADD(DAY, 1, DateKey)
  45.          FROM   CTE_DATE AS D
  46.          WHERE  D.DateKey < '2039-06-09')
  47. INSERT INTO DIM_DATE
  48.             (DateKey)
  49. SELECT D.DateKey
  50. FROM   CTE_DATE AS D
  51. OPTION (MAXRECURSION 32767);
  52.  
  53. --END DATA SETUP
  54. SET STATISTICS IO, TIME ON;
  55.  
  56.     DECLARE @StartDate DATE = '2016-01-01',
  57.             @EndDate   DATE = '2016-12-31';
  58.    
  59.     WITH MD
  60.          AS (SELECT Date,
  61.                     SUM(Adj) AS MemberDelta
  62.              FROM   Memberships
  63.                     CROSS APPLY (VALUES ( ValidFromDate, +1),
  64.                                         --Membership count decremented day after the ValidToDate
  65.                                         (DATEADD(DAY, 1, ValidToDate), -1) ) V(Date, Adj)
  66.              WHERE
  67.               --Members already expired before the time range of interest can be ignored
  68.               ValidToDate >= @StartDate
  69.               AND
  70.               --Members whose membership starts after the time range of interest can be ignored
  71.               ValidFromDate <= @EndDate
  72.              GROUP  BY Date),
  73.          MC
  74.          AS (SELECT DD.DateKey,
  75.                     SUM(MemberDelta) OVER (ORDER BY DD.DateKey ROWS UNBOUNDED PRECEDING) AS CountOfNonIgnoredMembers
  76.              FROM   DIM_DATE DD
  77.                     LEFT JOIN MD
  78.                       ON MD.Date = DD.DateKey)
  79.     SELECT DateKey,
  80.            CountOfNonIgnoredMembers AS MembershipCount
  81.     FROM   MC
  82.     WHERE  DateKey BETWEEN @StartDate AND @EndDate
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement