数据清理历史表-建立准确的历史记录(startdate enddate)

问题描述 投票:0回答:2

我在 SQL Server 中有一个历史表,其中有

startdate
enddate
。我必须删除重复的记录并用准确的历史记录填充另一个表(
startdate
enddate
)。

下表 -

ProductType
列与业务无关。我必须使用
Product
ProductPrice
StartDate
EndDate
列构建表格,其中如果存在任何重复记录,则为特定产品的
startdate= min(startdate)
和连续记录的
productprice
时期。
enddate
是特定产品的
max(enddate)
productprice
是连续周期。

示例 - 当前表格如下所示:

产品 产品类型 产品价格 开始日期 结束日期
A B 100 2018-09-18 2019-09-09
A C 100 2019-09-09 2019-12-09
A B 100 2019-12-08 2019-12-22
A C 150 2019-12-23 2019-12-24
A B 100 2019-12-25 2019-12-28

我面临的问题是,通过将第一个记录的

startdate
和产品价格的最后一个记录的结束日期取100,记录减少到2个。- 即不是准确的历史

产品 产品类型 产品价格 开始日期 结束日期
A 100 2018-09-18 2019-12-28
A 150 2019-12-23 2019-12-24

这是实际预期的历史记录

产品 产品类型 产品价格 开始日期 结束日期
A 100 2018-09-18 2019-12-22
A 150 2019-12-23 2019-12-24
A 100 2019-12-25 2019-12-28
sql sql-server ssis
2个回答
0
投票

这是一个经典的间隙和岛屿问题:

select  Product, [Product Price], MIN(startdate), max(enddate)
FROM    (
    select  SUM(flag) over(partition by product order by startdate) as grp
    ,   *
    from (
        select *
        , case when lag([product price]) over(partition by product order by startdate) <> [product price] then 1 else 0 end as flag
        from (
            VALUES  (N'A', N'B', 100, N'2018-09-18', N'2019-09-09')
            ,   (N'A', N'C', 100, N'2019-09-09', N'2019-12-09')
            ,   (N'A', N'B', 100, N'2019-12-08', N'2019-12-22')
            ,   (N'A', N'C', 150, N'2019-12-23', N'2019-12-24')
            ,   (N'A', N'B', 100, N'2019-12-25', N'2019-12-28')
        ) t (Product,[Product Type],[Product Price],StartDate,EndDate)
        ) x
    ) x
group by product, grp, [Product Price]

这是一个三步解决方案。

  1. 创建一个标志,每当您需要对更改进行分组时,该标志就会递增。
  2. 总结按日期排序的标志以创建组
  3. 按该组分组

-1
投票

如果我理解正确,以下查询将适合您。

select 
  product, 
  product_type, 
  product_price, 
  min(start_date) as start_date, 
  max(end_date) as end_date 
from producttype 
group by product, product_type, product_price;
© www.soinside.com 2019 - 2024. All rights reserved.