具有BackFilling最近日期的SQL查询

时间:2017-07-26 23:07:27

标签: sql-server tsql ssms

我有两张桌子。

Comments
  - CommentId
  - Comment
  - CreateDate
  - SomeCompositeKey

Exceptions
  - ExceptionId
  - Color
  - CreateDate
  - SomeCompositeKey
  - ...and so on...

我的评论表格中添加了一个新的Color列,其默认值为"白色"。

我需要回填并更新Comments表上的新颜色字段。我需要根据评论的最近Comments.Color和匹配的Exception.Color(基于CreateDate匹配)将Exception列设置为等于SomeCompositeKey

这是使用SQL Server Management Studio。

2 个答案:

答案 0 :(得分:1)

这应该可以解决问题......

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;
HTH,Jason

答案 1 :(得分:0)

检查此查询,它可以帮助您实现所需

;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