SQL Server 查询重复列的最新值

标签 sql sql-server t-sql window-functions

我有用户的组合。用户获得给定一周内发生的分数。如果给定周的最后一个可用分数为 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

最佳答案

您可以使用带有 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

结果

enter image description here

关于SQL Server 查询重复列的最新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54700252/

相关文章:

SQL - 组合多个类似的查询

sql - 计算日期是否在 BST 内 - SQL Server

sql - Oracle 空字符串/NULL

sql-server - 使用 SELECT 进行更新会导致死锁

sql - 为什么 "select count(*)"从无返回 1

mysql - Eloquent 枢轴 : how to do select columns in Laravel 5. 1

mysql - 重叠预订查询

java - SQL 服务器 "Lock request time out period exceeded".. 再次

sql - 如何在查询过程中清除 SQL 查询的结果消息数据?

sql-server - SQL Server 触发器、递归更新