如何解决在SQL Server中查询随时间变化的值的最小和最大日期的查询
我有一个表,该表具有以下三个指标的每月值:
CREATE TABLE #Temp
(
StoreId INT,FromDate DATE,ToDate DATE,AValue DECIMAL (18,4),BValue DECIMAL (18,CValue DECIMAL (18,4)
)
INSERT INTO #Temp
(
StoreId,FromDate,ToDate,AValue,BValue,CValue
)
VALUES
(1,N'2020-01-01',N'2020-01-31',5.5346,0.0000,0.0000),(1,N'2020-02-01',N'2020-02-29',N'2020-03-01',N'2020-03-31',N'2020-04-01',N'2020-04-30',2.8400),N'2020-05-01',N'2020-05-31',N'2020-06-01',N'2020-06-30',4.8400),N'2020-07-01',N'2020-07-31',(2,2.1234,1.0000,2.0000,2.4567,1.1020),1.1020)
,我需要为商店创建一个简明的时间表,并跟踪AValue,BValue和CValue如何随时间变化,每个部分都有一个FromDate和ToDate。结果表将是:
CREATE TABLE #Temp2
(
StoreId INT,4)
)
INSERT INTO #Temp2
(
StoreId,1.1020)
我开始考虑使用ROW_NUMBER和LEAD函数,但我仍然没有弄清楚:
SELECT StoreId,CValue,ROW_NUMBER() OVER (PARTITION BY StoreId
ORDER BY FromDate,ToDate) RecordNumber,CONVERT(VARCHAR (30),AValue) + '_' + CONVERT(VARCHAR (30),BValue) + '_' + CONVERT(VARCHAR (30),CValue) CombinedValues,LEAD(CONVERT(VARCHAR (30),CValue),1) OVER (PARTITION BY StoreId
ORDER BY FromDate,ToDate) NextCombinedValues
FROM #Temp
请注意,在按StoreId,AValue,BValue和CValue分组时,我不能只使用Max(FromDate)和Max(ToDate),因为这会产生错误的结果。
解决方法
我最终发现了这一点:
;WITH x AS (
SELECT StoreId,FromDate,ToDate,AValue,BValue,CValue,CONVERT(VARCHAR (30),AValue) + '_' + CONVERT(VARCHAR (30),BValue) + '_' + CONVERT(VARCHAR (30),CValue) CombinedValues
FROM #Temp
),y AS (
SELECT x.StoreId,x.FromDate,x.ToDate,x.AValue,x.BValue,x.CValue,x.CombinedValues,DENSE_RANK() OVER (PARTITION BY x.StoreId
ORDER BY x.FromDate) StoreDateRank,DENSE_RANK() OVER (PARTITION BY x.StoreId,x.CombinedValues
ORDER BY x.FromDate) ValuesAndDatesRank,DENSE_RANK() OVER (PARTITION BY x.StoreId
ORDER BY x.FromDate) - DENSE_RANK() OVER (PARTITION BY x.StoreId,x.CombinedValues
ORDER BY x.FromDate) ValueAndDatesGroups
FROM x
)
SELECT y.StoreId,MIN(y.FromDate) FromDate,MAX(y.ToDate) ToDate,y.AValue,y.BValue,y.CValue
FROM y
GROUP BY y.StoreId,y.CValue,y.ValueAndDatesGroups
ORDER BY y.StoreId,FromDate
,
您检查过临时表吗?
它们为您提供了跟踪随时间变化的方法。而且,它们还会自动无缝地将to / from列无缝添加。
执行SELECT语句时,可以使用FOR SYSTEM_TIME,并且可以查看该时间点表的状态,或者可以查看对特定PK所做的更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。