EMP*_*EMP 7 sql postgresql aggregate-functions
我正在使用PostgreSQL 9.1中的OVER子句的聚合函数,我想只返回每个窗口的最后一行.该last_value()
窗口的功能听起来像它可能做我想做的-但事实并非如此.它为窗口中的每一行返回一行,而我希望每个窗口只有一行
一个简化的例子:
SELECT a, some_func_like_last_value(b) OVER (PARTITION BY a ORDER BY b)
FROM
(
SELECT 1 AS a, 'do not want this' AS b
UNION SELECT 1, 'just want this'
) sub
Run Code Online (Sandbox Code Playgroud)
我希望这返回一行:
1, 'just want this'
Run Code Online (Sandbox Code Playgroud)
Erw*_*ter 14
DISTINCT
加上窗口功能添加一个DISTINCT
条款:
SELECT DISTINCT a
, last_value(b) OVER (PARTITION BY a ORDER BY b
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
FROM (
VALUES
(1, 'do not want this')
,(1, 'just want this')
) sub(a, b);
Run Code Online (Sandbox Code Playgroud)
更多关于DISTINCT
:
DISTINCT ON
PostgreSQL也有这个SQL标准的扩展:
SELECT DISTINCT ON (a)
a, b
FROM (
VALUES
(1, 'do not want this')
, (1, 'just want this')
) sub(a, b)
ORDER BY a, b DESC;
Run Code Online (Sandbox Code Playgroud)
更多关于DISTINCT ON
和可能更快的替代品:
如果您的案例实际上与您的演示一样简单(并且您不需要来自该最后一行的其他列),则简单聚合函数将更简单:
SELECT a, max(b)
FROM (
VALUES
(1, 'do not want this')
, (1, 'just want this')
) sub(a, b)
GROUP BY a;
Run Code Online (Sandbox Code Playgroud)