如何在具有现有订单的表上使用OVER(ORDER BY())?

时间:2017-04-12 15:02:52

标签: sql sql-server sum window-functions

我想要实现以下目标:

    SELECT DISTINCT 
    id AS Col0,
    'constant' AS Col1
    IIF(z < 0, x, 0) AS Col2,
    IIF(z > 0, x, 0) AS Col3,
    SUM(x) OVER(ORDER BY Col2 DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [Col4]
FROM y
ORDER BY Col2 DESC
OFFSET 0 ROWS
FETCH NEXT 500 ROWS ONLY

我正在尝试制作累积专栏。问题是我想使用表格&#39; ORDERBY()动态OVER()OVER(ORDERBY())不支持基于索引,也不接受Col1作为列。

我该怎么做呢?我可以在代码中轻松地做一些事情,但我更愿意学习如何在纯SQL中执行此操作。

1 个答案:

答案 0 :(得分:1)

只需将Order By Col2替换为用于创建Col2的表达式

SELECT DISTINCT 
    id AS Col0,
    'constant' AS Col1
    IIF(z < 0, x, 0) AS Col2,
    IIF(z > 0, x, 0) AS Col3,
    SUM(x) OVER(ORDER BY IIF(z > 0, x, 0) DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [Col4]
FROM y
ORDER BY Col2 DESC
OFFSET 0 ROWS
FETCH NEXT 500 ROWS ONLY