Advertisement
Guest User

Untitled

a guest
Nov 11th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 2.07 KB | None | 0 0
  1. WITH SubPortfolioCte AS
  2. (
  3.     SELECT PortfolioCode,
  4.         EffectiveFrom,
  5.         LEAD(EffectiveFrom) OVER (ORDER BY EffectiveFrom) AS EffectiveTo
  6.     FROM [dbo].[tblPortfolios]
  7.     WHERE [TimeSeriesCode] = 752
  8. ),
  9. PortfolioProductsCte AS
  10. (
  11.     SELECT p.EffectiveFrom, p.EffectiveTo, pc.*
  12.     FROM SubPortfolioCte p
  13.     LEFT JOIN [dbo].[tblPortfolioCombinations] pc on pc.PortfolioCode = p.PortfolioCode AND pc.Proportion > 0
  14. ),
  15. ProductDateCte AS
  16. (
  17.     SELECT ROW_NUMBER() OVER (PARTITION BY pp.PortfolioCode, fgd.ProductCode ORDER BY MonthEnded) MonthOrder,
  18.         pp.PortfolioCode,
  19.         pp.EffectiveFrom,
  20.         pp.EffectiveTo,
  21.         fgd.*
  22.     from PortfolioProductsCte pp
  23.     LEFT JOIN [dbo].[vwsFundGrowthData] fgd on fgd.ProductCode = CAST(pp.ProductCode AS nvarchar) AND pp.Proportion > 0 AND fgd.ProductType <> 0
  24. ),
  25. ProductDateByIslandCte AS
  26. (
  27.     SELECT PortfolioCode,
  28.         ProductCode,
  29.         MIN(MonthEnded) AS RangeStart,
  30.         MAX(MonthEnded) AS RangeEnd
  31.     FROM ProductDateCte
  32.     WHERE MonthEnded >= EffectiveFrom AND (MonthEnded <= EffectiveTo OR EffectiveTo IS NULL)
  33.     GROUP BY PortfolioCode,
  34.         ProductCode,
  35.         DATEDIFF(month, DATEADD(month, MonthOrder, '1900-01-01'), MonthEnded)
  36. ),
  37. ProductDateRangeCte AS
  38. (
  39.     SELECT PortfolioCode,
  40.         ProductCode,
  41.         MAX(RangeStart) AS RangeStart,
  42.         MAX(RangeEnd) AS RangeEnd
  43.     FROM ProductDateByIslandCte
  44.     WHERE RangeStart <> RangeEnd
  45.     GROUP BY PortfolioCode,
  46.         ProductCode
  47. ),
  48. PortfolioDateRangeCte AS
  49. (
  50.     SELECT PortfolioCode,
  51.         MAX(RangeStart) AS StartDate,
  52.         MIN(RangeEnd) AS EndDate
  53.     FROM ProductDateRangeCte
  54.     GROUP BY PortfolioCode
  55. ),
  56. PortfolioDateRangeIslandCte AS
  57. (
  58.     SELECT *,
  59.         SUM(CASE WHEN Islands.PreviousEndDate >= StartDate THEN 0 ELSE 1 END) OVER (ORDER BY Islands.RN) AS IslandId
  60.     FROM
  61.     (
  62.         SELECT ROW_NUMBER() OVER(ORDER BY StartDate, EndDate) AS RN,
  63.             StartDate,
  64.             EndDate,
  65.             LAG(EndDate,1) OVER (ORDER BY StartDate, EndDate) AS PreviousEndDate
  66.         FROM PortfolioDateRangeCte
  67.     ) AS Islands
  68. )
  69. SELECT TOP(1)
  70.     MIN(StartDate) AS IslandStartDate,
  71.     MAX(EndDate) AS IslandEndDate
  72. FROM PortfolioDateRangeIslandCte
  73. GROUP BY IslandId
  74. ORDER BY IslandEndDate DESC
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement