sql - 如何选择列值 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]
我尝试了两列的总和,但这不起作用,因为我正在寻找一个值范围之间的行,并且有条件选择所有小于给定值的行+选择给定值的下一个最大值..对于给定类型。 ..
解决方案
我们可以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 的第一行也将被包括在内,因为它的总数将被排除在运行总数之外。
推荐阅读
- javascript - 从某些外部资源修改 DDL 值时调用 DDL 的 Change 事件
- sql-server - SQL Server sysdiagrams 表在同一位置显示不一致
- python - lIndexError:列表分配索引超出范围
- mysql - 选择 SUM 达到 700 的记录
- ios - 模拟器中的 iOS MKMapSnapshotter 不起作用?
- r - 选择在数据框列表中重复的对
- ruby-on-rails - Carrierwave 如何重新处理原始文件
- amazon-s3 - Kentico 是否为媒体文件路径自动添加 CDN 端点 URL 前缀?
- selenium - 自动下载在 Firefox 中不起作用
- java - 在操作中使用静态变量