加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:16:08 所属栏目:百科 来源:网络整理
导读:我在PostgreSQL 9.1中使用带有OVER子句的聚合函数,我想只返回每个窗口的最后一行. last_value()窗口函数听起来像它可能做我想要的 – 但事实并非如此.它为窗口中的每一行返回一行,而我希望每个窗口只有一行 一个简化的例子: SELECT a,some_func_like_last_v
我在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

我希望这返回一行:

1,'just want this'
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);

有关DISTINCT的更多信息:

> PostgreSQL: running count of rows for a query ‘by minute’

使用DISTINCT ON更简单,更快捷

PostgreSQL也有这个SQL标准的扩展:

SELECT DISTINCT ON (a)
       a,b
FROM  (
   VALUES
     (1,b)
ORDER  BY a,b DESC;

有关DISTINCT ON和可能更快的替代方案的更多信息:

> Select first row in each GROUP BY group?

普通聚合的简单案例

如果您的案例实际上与您的演示一样简单(并且您不需要来自该最后一行的其他列),则简单聚合函数将更简单:

SELECT a,max(b)
FROM  (
   VALUES
     (1,b)
GROUP  BY a;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读