如何通过窗口函数过滤聚合函数的 SQL 语句中的行?

Posted

技术标签:

【中文标题】如何通过窗口函数过滤聚合函数的 SQL 语句中的行?【英文标题】:How to filter rows in SQL statement for aggregate function by window function? 【发布时间】:2017-02-15 12:32:09 【问题描述】:

我有一些表格并向用户提供工具以根据现有内容生成新列。

表:

+---+
|  a|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
|  5|
+---+

新列名:b

新的列规则必须是这样的:max(a) over(WHERE a < 3)

如何正确写这个?

结果必须类似于 SQL 语句:SELECT *, (SELECT max(a) FROM table WHERE a < 3) as b FROM table。并返回:

+---+---+
|  a|  b|
+---+---+
|  0|  2|
|  1|  2|
|  2|  2|
|  3|  2|
|  4|  2|
|  5|  2|
+---+---+

但是我不能在 over() WHERE 语句里面写,也不能让用户知道表的名称。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

只需使用带有case的窗口函数:

select a, max(case when a < 3 then a end) over () as b
from t;

【讨论】:

以上是关于如何通过窗口函数过滤聚合函数的 SQL 语句中的行?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server中的开窗函数是啥?

为啥sql查询语句中的count(*)等聚合函数可以放在having后面,而不能放在where后面?

窗口函数

SQL中的窗口是啥?

MySQL窗口函数_聚合函数

SQL:如何根据窗口框架中的聚合最小值/最大值选择列值(包括前面的行)