下面是我表中的数据。我需要计算特定位置下一行的MINMAXPOINTS之间的差异,如果为正,则将输出记录为1,如果为负值,则将输出记录为0,然后将所有输出值加到本地声明的变量中。
Id Date Position MINMAXPOINTS
1 1/11/2016 ABOVE 82.4
2 1/5/2016 ABOVE 81.75
3 12/1/2015 ABOVE 72.79
4 10/28/2015 ABOVE 76.7
5 10/20/2015 ABOVE 80
6 1/15/2016 BELOW 68.4
7 1/7/2016 BELOW 72.29
8 12/14/2015 BELOW 61.25
9 11/10/2015 BELOW 60.89
10 10/27/2015 BELOW 73.29
11 9/4/2015 BELOW 54.35以上数据由PARTITION编辑,Position编辑,ORDER编辑Date DESC编辑。
ROW_NUMBER() OVER (PARTITION BY CTE_MinMax.Position ORDER BY [Date] DESC) AS MINMAXPOINTS所以算法是这样的:
MINMAXPOINTS差之和,如:(1-2) + (2-3) + (3-4) + (4-5),'ABOVE'为(6-7) + (7-8) + (8-9) + (9-10) + (10-11)。'ABOVE',(-1)+ (1) + (1) +(-1)+(-1)+ (1) 'BELOW''ABOVE'和'BELOW'的所有值相加,并将1存储为本地声明变量中的总计。在上面的场景中,减数应该是可配置的。因此,如果我输入2,那么只有2对Positions应该被总结如下:
(1-2) + (2-3)用于'ABOVE',(6-7) + (7-8)用于'BELOW'
导致了总计的3。
如果只使用- WITH CTEs或其他东西,而不使用游标,或者在可能的情况下不创建任何表,那就太棒了。
任何帮助都将不胜感激!
发布于 2016-01-18 13:45:33
WITH temp
AS
(
SELECT *, ROW_NUMBER() OVER(ORDER BY Position, Date) AS srn
FROM Table1
),
temp1
AS
(
SELECT t.*, ROW_NUMBER() OVER(PARTITION BY Position ORDER BY srn) AS srn1
FROM
(
SELECT t1.*, (t1.MINMAXPOINTS - t2.MINMAXPOINTS) AS Diff
FROM temp t1
LEFT JOIN temp t2
ON t1.srn = t2.srn - 1 AND t1.Position = t2.Position
)t
)
SELECT Position, SUM(Diff)
FROM temp1
WHERE
srn1 <= 2 -- 3, 4 any number upto which you need to calculate total
GROUP BY Position https://stackoverflow.com/questions/34855105
复制相似问题