2017-07-26 111 views
2

我有兩個表。帶有回填的最近日期的SQL查詢

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。

+0

有多少種不同的顏色那裏?如果沒有那麼多,您可以在創建字段上使用case語句的更新。 –

回答

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 
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,傑森