首页 > 解决方案 > 如何选择列值 min 到给定值的累积总和的行

问题描述

我需要从 PostgreSQL 中获取数据,我需要在以下条件下选择行。

id  type  total_quantity created_dttm [desc]
1    1    10            30-Jun-2021
2    1    12            27-Jun-2021
3    1    32            26-Jun-2021
4    1    52            25-Jun-2021

需要在查询和类型中获取与给定值匹配的所有行 [total_quantity 列值的总和]。如果我将值设为 24 并键入 1,那么我需要获取所有行 [total_quantity 值的累积值] <= 24 并且还获取大于给定值的下一个直接行,其余行需要被忽略。行 [s] 通过 created_dttm desc 通过 Order 获取,因此我只需要获取三行.. 对于给定的值 24 和类型 = 1。

id  type  total_quantity created_dttm [desc]

1    1    10         30-Jun-2021  [10 less than 24 ] fetch row
2    1    12         27-Jun-2021  [22 (sum of current row &previous) less than 24]fetch row
3    1    32         26-Jun-2021  [54 [10+12+32]greater than 24] when greater than reached; 
                                  then fetch this row only
4    1    52         25-Jun-2021   [query should not fetch this row, since max reached @ id 3]

我尝试了两列的总和,但这不起作用,因为我正在寻找一个值范围之间的行,并且有条件选择所有小于给定值的行+选择给定值的下一个最大值..对于给定类型。 ..

标签: sqlpostgresql

解决方案


我们可以SUM在这里用作分析函数:

WITH cte AS (
    SELECT *, SUM(total_quantity) OVER (ORDER BY created_dttm DESC)
                  - total_quantity AS tq_sum
    FROM yourTable
)

SELECT id, type, total_quantity, created_dttm
FROM cte
WHERE tq_sum < 24;

演示

上述技巧(在 CTE 中)通过从运行总数中保留当前行的总数来工作。因此,超过阈值 24 的第一行也将被包括在内,因为它的总数将被排除在运行总数之外。


推荐阅读