根据tsql中其他列的先前值更新列

时间:2017-05-30 20:56:44

标签: sql-server tsql

我需要更新此查询中的目标列

CREATE TABLE #test 
(
     id INT IDENTITY(1,1),  
     score int, 
     goal int
)

INSERT INTO #test(score) VALUES (80)
INSERT INTO #test(score) VALUES (86)
INSERT INTO #test(score) VALUES (90)
INSERT INTO #test(score) VALUES (90)
INSERT INTO #test(score) VALUES (90)
INSERT INTO #test(score) VALUES (80)
INSERT INTO #test(score) VALUES (95)
INSERT INTO #test(score) VALUES (95)
INSERT INTO #test(score) VALUES (95)
INSERT INTO #test(score) VALUES (95)
INSERT INTO #test(score) VALUES (95)
INSERT INTO #test(score) VALUES (89)

--- initial goal 5
-- if score is 90 or above for 3 continuous week then goal is 3
-- if score is 95 or above for 5 continuous week then goal is 1

1 个答案:

答案 0 :(得分:0)

快速笔记:

  1. 我修复了你的示例sql以添加日期。
  2. 我使用DATEADD功能轻松计算周数。
  3. 根据您的逻辑需求,您可能需要调整更新中的DATEADD函数。如果你想成为终极专属,那么你并不是100%明确,所以我认为它们最终是包容
  4. 你应该可以做类似的事情:

    UPDATE  #Test
    SET     Goal = 3
    WHERE   Id IN ( SELECT  Id
                    FROM    #Test AS t
                    OUTER APPLY ( SELECT    COUNT(1) AS 'Number'
                                  FROM      #Test AS t2
                                  WHERE     t2.Date BETWEEN DATEADD(WEEK, -2, t.Date) AND t.Date AND
                                            t2.Score >= 90
                                ) AS t2
                    WHERE   t2.Number >= 3 );
    
    UPDATE  #Test
    SET     Goal = 1
    WHERE   Id IN ( SELECT  Id
                    FROM    #Test AS t
                    OUTER APPLY ( SELECT    COUNT(1) AS 'Number'
                                  FROM      #Test AS t2
                                  WHERE     t2.Date BETWEEN DATEADD(WEEK, -4, t.Date) AND t.Date AND
                                            t2.Score >= 95
                                ) AS t2
                    WHERE   t2.Number >= 5 );
    

    最难的部分是计算“滚动”数字。我使用OUTER APPLY这样做,虽然可以通过几种不同的方式完成。几年前我问了一个类似的question,解决方法是使用CROSS APPLY。因此,您的里程可能会有所不同,而其他人可能会有不同的解决方案,但这样可以让您了解如何继续。

    这是表结束时的结果集:

    Result set

    这是我用来生成表的sql。如果您计划在最终结果中使用临时表,请不要忘记放下临时表!

    IF OBJECT_ID('tempdb..#Test') IS NOT NULL
        DROP TABLE #Test;
    
    DECLARE @StartDate AS DATE = '2017-01-01';
    CREATE TABLE #Test
        (
          Id INT IDENTITY(1, 1)
        , Score INT
        , Goal INT
        , Date DATE
        );
    INSERT  INTO #Test
            ( Score, Date )
    VALUES  ( 80, DATEADD(WEEK, 0, @StartDate) )  ,
            ( 86, DATEADD(WEEK, 1, @StartDate) )  ,
            ( 90, DATEADD(WEEK, 2, @StartDate) )  ,
            ( 90, DATEADD(WEEK, 3, @StartDate) )  ,
            ( 90, DATEADD(WEEK, 4, @StartDate) )  ,
            ( 80, DATEADD(WEEK, 5, @StartDate) )  ,
            ( 95, DATEADD(WEEK, 6, @StartDate) )  ,
            ( 95, DATEADD(WEEK, 7, @StartDate) )  ,
            ( 95, DATEADD(WEEK, 8, @StartDate) )  ,
            ( 95, DATEADD(WEEK, 9, @StartDate) )  ,
            ( 95, DATEADD(WEEK, 10, @StartDate) ) ,
            ( 89, DATEADD(WEEK, 11, @StartDate) );
    
    DROP TABLE #Test;
    
相关问题