如何在具有现有 order by 的表上使用 OVER(ORDER BY())?
Posted
技术标签:
【中文标题】如何在具有现有 order by 的表上使用 OVER(ORDER BY())?【英文标题】:How do you use OVER(ORDER BY()) on a table with an existing order by? 【发布时间】:2017-04-12 15:02:51 【问题描述】:我想实现以下目标:
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
我正在尝试创建一个累积列。问题是我想在OVER()
上动态使用表的ORDERBY()
,但OVER(ORDERBY())
不支持基于索引,也不接受Col1
作为列。
我该怎么做呢?之后我可以在代码中轻松地做一些事情,但我更愿意学习如何在纯 SQL 中做到这一点。
【问题讨论】:
你能显示样本输入和你想要的输出吗?注意出现在OVER
子句中的ORDER BY
与窗口函数SUM()
有关,不是结果集的顺序。
【参考方案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
【讨论】:
好的,我明白了。但是,如果我必须订购恒定值,它不会接受它。但无论如何,我可能都得想办法解决这个问题。以上是关于如何在具有现有 order by 的表上使用 OVER(ORDER BY())?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 QueryDSL 在 Spring Data JPA 中使用 order by 和 Limit
如何使用具有多个 GROUP BY、子查询和 WHERE IN 在大表上的查询来优化查询?
如何在 EF Code First 中声明具有 Medium Blob 数据类型的表上的字段