我需要更新此查询中的目标列
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
答案 0 :(得分:0)
快速笔记:
DATEADD
功能轻松计算周数。DATEADD
函数。如果你想成为终极专属,那么你并不是100%明确,所以我认为它们最终是包容。你应该可以做类似的事情:
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
。因此,您的里程可能会有所不同,而其他人可能会有不同的解决方案,但这样可以让您了解如何继续。
这是表结束时的结果集:
这是我用来生成表的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;