Sql server 用于回填的日期最近的SQL查询
我有两张桌子Sql server 用于回填的日期最近的SQL查询,sql-server,tsql,ssms,Sql Server,Tsql,Ssms,我有两张桌子 Comments - CommentId - Comment - CreateDate - SomeCompositeKey Exceptions - ExceptionId - Color - CreateDate - SomeCompositeKey - ...and so on... My Comments表将添加一个默认值为白色的新颜色列 我需要回填和更新Comments表上的新颜色字段。我需要将Comments.Color列设置为等
Comments
- CommentId
- Comment
- CreateDate
- SomeCompositeKey
Exceptions
- ExceptionId
- Color
- CreateDate
- SomeCompositeKey
- ...and so on...
My Comments表将添加一个默认值为白色的新颜色列
我需要回填和更新Comments表上的新颜色字段。我需要将Comments.Color列设置为等于Exception.Color(基于注释最近的CreateDate)和基于SomeCompositeKey匹配的匹配异常
这是在使用SQL Server Management Studio。检查此查询,它可能会帮助您实现所需的功能
;with data
as
(
Select ExceptionId,Color, SomeCompositeKey
,row_number() over (partition by SomeCompositeKey order by CreateDate desc) rowNumber
from Exceptions
)
update Comments set newColor=d.Color
from data d where d.rowNumber=1
and Comments.SomeCompositeKey=d.SomeCompositeKey
这应该可以解决问题
IF OBJECT_ID('tempdb..#Comments', 'U') IS NULL
BEGIN -- DROP TABLE #Comments;
CREATE TABLE #Comments (
CommentId INT NOT NULL PRIMARY KEY CLUSTERED,
Comment VARCHAR(100) NOT NULL,
CreatedDate DATETIME NOT NULL,
Color VARCHAR(10) NOT NULL DEFAULT('White')
);
INSERT #Comments (CommentId, Comment, CreatedDate)
SELECT
t.n,
'Blah Blah Blah',
DATEADD(hh, t.n, GETDATE())
FROM
dbo.tfn_Tally(1500, 1) t;
END;
IF OBJECT_ID('tempdb..#Exceptions', 'U') IS NULL
BEGIN -- DROP TABLE #Exceptions;
CREATE TABLE #Exceptions (
ExceptionId INT NOT NULL PRIMARY KEY CLUSTERED,
Color VARCHAR(10) NOT NULL,
CreatedDate DATETIME NOT NULL
);
INSERT #Exceptions (ExceptionId, Color, CreatedDate)
SELECT
t.n,
CASE t.n % 9
WHEN 0 THEN 'Red'
WHEN 1 THEN 'Blue'
WHEN 2 THEN 'Green'
WHEN 3 THEN 'Yellow'
WHEN 4 THEN 'Purple'
WHEN 5 THEN 'Orance'
WHEN 6 THEN 'Gray'
WHEN 7 THEN 'White'
WHEN 8 THEN 'Black'
END,
DATEADD(hh, t.n * 13, GETDATE())
FROM
dbo.tfn_Tally(100, 1) t;
-- Add a unique nci on the CreatedDate column to improve performance.
CREATE UNIQUE NONCLUSTERED INDEX uix_Exceptions_CreatedDate ON #Exceptions
(CreatedDate) INCLUDE (Color);
END;
--=========================================================
-- option 1 (faster when there is an index on e.CreatedDate)
UPDATE c SET
c.Color = ex.Color
FROM
#Comments c
CROSS APPLY (
SELECT TOP 1
e.Color
FROM
#Exceptions e
WHERE
c.CreatedDate >= e.CreatedDate
ORDER BY
e.CreatedDate DESC
) ex;
--=========================================================
-- option 2 (faster when there is not index on e.CreatedDate)
WITH
cte_ExceptionRange AS (
SELECT
e.Color,
BegData = e.CreatedDate,
EndDate = LEAD(e.CreatedDate, 1, '9999-12-31') OVER (ORDER BY e.CreatedDate)
FROM
#Exceptions e
)
UPDATE c SET
c.Color = er.Color
FROM
#Comments c
JOIN cte_ExceptionRange er
ON c.CreatedDate >= er.BegData
AND c.CreatedDate <er.EndDate;
嗯,杰森有多少种不同的颜色?如果没有那么多,您可以在createdate字段上使用带有case语句的更新。