我想编写一个查询,从有序表中提取行,同时聚合一列的值,直到所述聚合值达到所需的阈值为止。
另一个条件是,超过阈值的违规行应包括在查询结果中。
我寻找了用PostgreSQL完成的其他解决方案,引导我创建了以下查询:
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函数,尽管我不知道从哪里开始进行这种聚合查询。
如果有人有任何想法或诀窍,我会非常感激的。
发布于 2017-11-26 01:33:37
在窗口函数的ORDER BY子句中添加一个唯一列(主键),例如:
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获取通过阈值的违规行,例如:
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
);发布于 2017-11-26 03:14:55
如果您想要最后一行(超过阈值的行),那么您有两个相对简单的选择。我的偏好是:
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;另一种选择是加窗条款:
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;https://stackoverflow.com/questions/47492040
复制相似问题