【问题标题】:Summarise Dimension Data to single Row将维度数据汇总到单行
【发布时间】:2020-10-06 13:46:10
【问题描述】:

我有一个维度,其中包含许多类似于以下属性的维度,我已经为 1 个产品和列的子集进行了简化:

我想要做的是总结:对于给定的 ProdID, 当前的 ClosedDate 是什么? 当前关闭日期是什么时候开始的? 上一个 ClosedDate 是什么? 上一个 ClosedDate 是什么时候开始的?

例如从这个例子我的答案是:

关闭日期不遵循任何特定顺序。产品不必有关闭日期,如果有,则为 -1。

据我所知,我可以使用 ROW_NUMBER() 来索引每个历史项目,因为这将有助于处理最近的内容和之前的 ClosedDate。我不知道如何使上一个关闭日期有效,特别是在我有 2 行与 20200408 相关的历史记录的情况下。

任何建议表示赞赏。

【问题讨论】:

  • closedDate 存在平局时,您如何决定将哪一行视为行?
  • 上一个关闭日期值将是与当前行不同的那个,然后是最早的一个(如果有平局,则更高的历史记录)

标签: sql sql-server tsql select window-functions


【解决方案1】:

一个选项仅使用 Windows 功能。假设closedDate 上的关系通过选择最高的historyRow 被打破,那就是:

select 
    prodID,
    closedDate as closedDateCurrent,
    validFrom as closedDateCurrentStart,
    previousClosedDate,
    previousClosedDateStart
from (
    select
        t.*,
        row_number()    
            over(partition by prodID order by closedDate desc, historyRow desc) 
            as rn,
        lag(closedDate) 
            over(partition by prodID order by closedDate desc, historyRow desc) 
            as previousClosedDate,
        lag(validFrom) 
            over(partition by prodID order by closedDate desc, historyRow desc) 
            as previousClosedDateStart
    from mytable t
) t
where rn = 1

【讨论】:

  • 谢谢你。但是,我刚刚尝试过,前一个关闭日期和前一个关闭日期开始时我得到 NULL。
  • @MrHappyHead:那么这意味着您的数据有 null 值开始,这与您的示例数据显示的不同......
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 2015-03-02
  • 2022-01-01
  • 2016-08-31
相关资源
最近更新 更多