首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL:选择行,直到单个列的和缩减超过阈值为止。

PostgreSQL:选择行,直到单个列的和缩减超过阈值为止。
EN

Stack Overflow用户
提问于 2017-11-26 01:01:17
回答 2查看 1.7K关注 0票数 3

我想编写一个查询,从有序表中提取行,同时聚合一列的值,直到所述聚合值达到所需的阈值为止。

另一个条件是,超过阈值的违规行应包括在查询结果中。

我寻找了用PostgreSQL完成的其他解决方案,引导我创建了以下查询:

代码语言:javascript
复制
SELECT * FROM (
    SELECT *, SUM(amount) OVER (ORDER BY amount DESC) AS running_amount
    FROM public.orders WHERE price = 0.09) AS t
WHERE t.running_amount <= 15;

但是,此查询的问题在于它表示一个PostgreSQL窗口查询,如果给定行的列值不是唯一的,则该查询将跳过所有行的列值的聚合。

不幸的是,窗口查询不支持考虑不同值列的考虑。

我听说了一些让这成为可能的替代方法是通过创建一个PostgreSQL函数,尽管我不知道从哪里开始进行这种聚合查询。

如果有人有任何想法或诀窍,我会非常感激的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-26 01:33:37

在窗口函数的ORDER BY子句中添加一个唯一列(主键),例如:

代码语言:javascript
复制
SELECT * FROM (
    SELECT *, SUM(amount) OVER (ORDER BY amount DESC, id) AS running_amount
    FROM public.orders WHERE price = 0.09
) AS t
WHERE t.running_amount <= 15;

在缺少唯一列的情况下,可以使用系统列ctid.

您可以使用UNION ALL获取通过阈值的违规行,例如:

代码语言:javascript
复制
WITH cte AS (
    SELECT *, SUM(amount) OVER (ORDER BY amount DESC, id) AS running_amount
    FROM public.orders 
    WHERE price = 0.09
)
SELECT * 
FROM cte
WHERE running_amount <= 15
UNION ALL (
    SELECT * 
    FROM cte
    WHERE running_amount > 15
    LIMIT 1
);
票数 4
EN

Stack Overflow用户

发布于 2017-11-26 03:14:55

如果您想要最后一行(超过阈值的行),那么您有两个相对简单的选择。我的偏好是:

代码语言:javascript
复制
SELECT o.*
FROM (SELECT o.*,
             SUM(amount) OVER (ORDER BY amount DESC) AS running_amount
      FROM public.orders
      WHERE price = 0.09
     ) o
WHERE o.running_amount - o.amount <= 15;

另一种选择是加窗条款:

代码语言:javascript
复制
SELECT o.*
FROM (SELECT o.*,
             SUM(amount) OVER (ORDER BY amount DESC
                               ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
                              ) AS running_amount
      FROM public.orders
      WHERE price = 0.09
     ) o
WHERE o.running_amount <= 15;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47492040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档