通过迭代数据来查找阈值

时间:2017-05-18 12:36:30

标签: sql postgresql

表"文件"看起来如下:

File (
    id    (varchar);  
    size (double);
    status (varchar);
    timestamp (date);
)

我想制定一个SQL查询,确定具有该时间戳和早期时间戳的所有文件的最早日期(时间戳):

  1. 总大小超过某个默认值

  2. 状态等于"已处理"

  3. 类似的东西:

    select MIN(timestamp)
    from File
    where status = "processed"
     and SUM(size) > 1456,98
    

    问题在于这部分是运算符SUM,它应该应用于所有文件的大小,其时间戳等于或早于此查询应该实际返回的时间戳。 是否可以进行这样的SQL查询?

2 个答案:

答案 0 :(得分:1)

在ANSI标准SQL中,您将使用窗口函数:

select min(timestamp)
from (select t.*,
             sum(size) over (order by timestamp) as cumesize
      from files f
     ) f
where cumsize > 1456.98 and
      status = 'processed';

注意:这会计算所有文件的大小。如果您想要仅处理文件的大小总和,则将状态条件移动到子查询。

答案 1 :(得分:0)

如果你的dbms不支持窗口函数:

select MIN(timestamp)
from File f1
where status = "processed"
 and (select SUM(size)
      from File f2
      where f2.timestamp <= f1.timestamp
        and status = "processed") > 1456,98