【问题标题】:SQL Server query to repeat latest value of a columnSQL Server 查询以重复列的最新值
【发布时间】:2019-07-09 01:28:13
【问题描述】:

我有UsersWeeks 的组合。用户获得在给定一周内发生的分数。如果它是null,我需要帮助重复给定周的最后可用分数。

我已经尝试了很多解决方案,包括LAST_VALUE

SELECT UserId, StartOfWeekDate, Score ,LAST_VALUE(Score) 
OVER (PARTITION BY UserId ORDER BY StartOfWeekDate ASC) AS LastValue
FROM [ScoresByUserOverWeek]

目前是这样的:

UserId  StartOfWeekDate overall LastValue

12534   12/17/2018      NULL    NULL

12534   12/24/2018      NULL    NULL

12534   12/31/2018      320     320

12534   1/7/2019        NULL    NULL

12534   1/14/2019       NULL    NULL

12534   1/21/2019       NULL    NULL

12534   1/28/2019       345     345

12534   2/4/2019        NULL    NULL

12534   2/11/2019       NULL    NULL

预期:

UserId  StartOfWeekDate overall LastValue

12534   12/17/2018      NULL    NULL

12534   12/24/2018      NULL    NULL

12534   12/31/2018      320     320

12534   1/7/2019        NULL    320

12534   1/14/2019       NULL    320

12534   1/21/2019       NULL    320

12534   1/28/2019       345     345

12534   2/4/2019        NULL    345

12534   2/11/2019       NULL    345

【问题讨论】:

  • 将记录插入临时表或表变量,然后在 WHILE 中更新 LastValue 在这种情况下将优于任何 SQL

标签: sql sql-server tsql window-functions


【解决方案1】:

您可以使用带有CASE WHEN 子句的子查询来实现:

SELECT UserId, StartOfWeekDate, Score ,
CASE WHEN Score IS NOT NULL THEN Score ELSE 
(SELECT TOP 1 Score FROM ScoresByUserOverWeek T2 WHERE T1.UserID = T2.UserID AND T1.StartOfWeekDate > T2.StartOfWeekDate  AND T2.Score IS NOT NULL ORDER BY T2.StartOfWeekDate DESC) 
END AS LastValue
FROM ScoresByUserOverWeek T1

实验

--Create Table and Insert Values
CREATE TABLE #TEMP (UserId INT, StartOfWeekDate DATETIME, Score INT)

INSERT INTO #TEMP (UserId , StartOfWeekDate , Score )

VALUES( 12534 , '20181217' , NULL ),
( 12534, '20181224' , NULL ),
( 12534, '20181231' , 320 ),
( 12534, '20190107' , NULL ),
( 12534, '20190114' , NULL ),
( 12534, '20190121' , NULL ),
( 12534, '20190128' , 345 ),
( 12534, '20190204' , NULL ),
( 12534, '20190211' , NULL )



--Execute Query
SELECT UserId, StartOfWeekDate, Score ,
CASE WHEN Score IS NOT NULL THEN Score ELSE 
(SELECT TOP 1 Score FROM #TEMP T2 WHERE T1.UserID = T2.UserID AND T1.StartOfWeekDate > T2.StartOfWeekDate  AND T2.Score IS NOT NULL ORDER BY T2.StartOfWeekDate DESC) 
END AS LastValue
FROM #TEMP T1

结果

【讨论】:

  • 性能很糟糕,但它确实有效。尝试使用 max 结合 over(partition by) 来最大化您的查询
  • @AlvaroParra 我同意它可能没有性能。但这并不像你提到的那样可怕
猜你喜欢
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
相关资源
最近更新 更多