我在 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 |
这是一个经典的间隙和岛屿问题:
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]
这是一个三步解决方案。
如果我理解正确,以下查询将适合您。
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;