如何在具有现有 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())?的主要内容,如果未能解决你的问题,请参考以下文章

高效的 ORDER BY 与大型表上的依赖子查询

如何使用 QueryDSL 在 Spring Data JPA 中使用 order by 和 Limit

如何使用具有多个 GROUP BY、子查询和 WHERE IN 在大表上的查询来优化查询?

如何在 EF Code First 中声明具有 Medium Blob 数据类型的表上的字段

如何使用 UNION 组合两个具有 ORDER BY 的查询?

MYSQL order by - NULL 值影响我的结果