我知道它在 SQL-92 中是不允许的。但从那以后它可能已经改变了,特别是当应用了一个窗口时。您能否解释这些变化并给出引入它们的版本(或版本,如果有更多)?
例子
-
SUM(COUNT(votes.option_id)) OVER() 是每个标准 SQL:2016(或更早版本)的有效语法吗?
这是我在为什么在PostgreSQL中使用窗口函数时可以嵌套聚合函数?.
- Codewars的Calculating Running Total (SQL) kata是其最受好评的解决方案(使用 PostgreSQL 13.0,一个高度符合标准的引擎,因此代码很可能是标准的)这个:
SELECT
CREATED_AT::DATE AS DATE,
COUNT(CREATED_AT) AS COUNT,
SUM(COUNT(CREATED_AT)) OVER (ORDER BY CREATED_AT::DATE ROWS UNBOUNDED PRECEDING)::INT AS TOTAL
FROM
POSTS
GROUP BY
CREATED_AT::DATE
(可以简化为:
SELECT
created_at::DATE date,
COUNT(*) COUNT,
SUM(COUNT(*)) OVER (ORDER BY created_at::DATE)::INT total
FROM posts
GROUP BY created_at::DATE
我认为::
s 是一种我不知道的新语法。现在允许从 TIMESTAMP 转换为 DATE(在 SQL-92 中不允许)。)
- 正如这个 SO 答案所解释的,即使没有窗口,Oracle 数据库也允许它
GROUP BY
从上下文中提取。我不知道标准是否允许。