PostgreSQL聚合或窗口函数只返回最后一个值

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)