SQL 服务器:通过 id 从每日日期生成压缩范围数据

SQL Server: Generate squashed range data from daily dates by an id

基本上总结一下目标。我想使用以下数据生成一些东西。小计如 excel,其中“每项更改……都是有序的”生成摘要记录,并且仅生成摘要记录和压缩日期范围。

我想要的只是计数记录将生成行并复制费用数据,除了 begin/end 字段将是范围日期。例如,第一个记录是 3/31 - 4/14 的费用 9858。每个计数行都是一个新的费用记录。

我不确定分组、分区...等的哪种组合可以满足我的需要,或者我是否可以使用其他东西。如果需要,我可以提供 sql,但我主要是在寻找能够提供此功能的正确工具组合(分区依据、分组、汇总......)。

WITH [ag]
  AS (SELECT *,
             LAG([Fee_ID]) OVER (ORDER BY [FeeTypeID], [FeeBeginDate]) [FirstFee],
             LAG([Fee_ID]) OVER (ORDER BY [FeeTypeID], [FeeBeginDate] DESC) [LastFee]
        FROM [dbo].[HHTFees]
       WHERE [Retailer] = 517),
     [agf]
  AS (SELECT *,
             'Beg' [FeeStopType]
        FROM [ag]
       WHERE [ag].[FirstFee] <> [ag].[Fee_ID]
          OR [ag].[FirstFee] IS NULL),
     [agl]
  AS (SELECT *,
             'End' [FeeStopType]
        FROM [ag]
       WHERE [ag].[LastFee] <> [ag].[Fee_ID]
          OR [ag].[LastFee] IS NULL),
     [results]
  AS (SELECT *
        FROM [agf]
      UNION
      SELECT *
        FROM [agl]),
     [indexed]
  AS (SELECT *,
             ROW_NUMBER() OVER (ORDER BY [results].[FeeTypeID], [results].[FeeBeginDate]) [RowNum]
        FROM [results])
SELECT      [Starts].[Retailer],
            [Starts].[Chain_key],
            [Starts].[Fee_ID],
            [Starts].[FeeTypeID],
            [Starts].[FeeChgTypeID],
            [Starts].[Fee],
            [Starts].[FeeDescription],
            [Starts].[FeeTypeDescription],
            [Starts].[FeeBeginDate],
            [Ends].[FeeEndDate],
            [Starts].[FeeAmt],
            [Starts].[HHT_ID],
            [Starts].[CreatedBy],
            [Starts].[CreatedDate],
            [Starts].[ModifiedBy],
            [Starts].[ModifiedDate],
            [Starts].[MsgID],
            [Starts].[ScopeOrder],
            [Starts].[Scope],
            [Starts].[FirstFee],
            [Starts].[LastFee],
            [Starts].[FeeStopType],
            [Starts].[RowNum]
  FROM      [indexed] [Starts]
 INNER JOIN [indexed] [Ends]
    ON [Starts].[Fee_ID] = [Ends].[Fee_ID]
   AND [Ends].[RowNum]   = [Starts].[RowNum] + 1;

我使用滞后来查找费用 ID 更改的位置(按费用类型/开始日期排序)。这让我可以模仿按开始日期排序的费用 ID 发生变化的情况,例如 excel 小计。现在优化和调整以适应数据集。