sql - 如何过滤有序表,直到达到阈值的第一行?

标签 sql postgresql

我正在使用 PostgreSQL,并且我有一个 table包含以下列:id , distance ,和length 。我想通过 distance 订购 table 并创建一个名为 cum_length 的新列使用窗口函数。我还想过滤行,以便仅显示 cum_length 之前的行。超过一定阈值的值包含在最终结果中。

输入示例table :

<表类=“s-表”> <标题> id 距离 长度 <正文> 1 10 1 2 5 2 3 8 1 4 1 3 5 3 2 6 9 2

阈值 6 的所需输出:

<表类=“s-表”> <标题> id 距离 长度 cum_length <正文> 4 1 3 3 5 3 2 5 2 5 2 7

这是我想出的 SQL:

WITH ordered_table AS (
  SELECT id,
    distance,
    length,
    SUM(length) OVER (ORDER BY distance) AS cum_length
  FROM table)
SELECT *
FROM ordered_table
WHERE cum_length <= 6

但这忽略了所需结果的最后一行。

最佳答案

尝试以下操作:

WITH ordered_table AS 
(
  SELECT id, distance, length,
    SUM(length) OVER (ORDER BY distance) AS cum_length
  FROM table_name
)
SELECT id, distance, length, cum_length
FROM ordered_table
WHERE cum_length <= COALESCE((SELECT MIN(cum_length) FROM ordered_table WHERE cum_length > 6), 6)

对于您的示例数据,这相当于 WHERE cum_length <= 7 .

See demo

关于sql - 如何过滤有序表,直到达到阈值的第一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75057609/

相关文章:

sql - 从 JSONB 列中按键选择不同的值

postgresql - 跟踪长时间运行函数(从外部)进度的最佳方法 - PostgreSQL 11?

postgresql - 禁用 PostgreSQL 8.4 tsvector 解析器的 `file` token 类型

sql - 如何将此GROUP BY/MIN SQL查询转换为LINQ?

php - 将旧表中的额外内容复制到新表

sql - 使用 SQL DB2 按天限制返回

php - 寻找最短路径最多分离十度

Java 调试器 (Netbeans) 在 try block 中的不成功行上停止,并且不允许继续

php - 如何选择每个日期间隔的唯一身份访问者?

php - MYSQL生成下拉列表