查找废弃的记录PostgreSQL

时间:2018-08-02 09:59:21

标签: sql postgresql

我有这个查询

select count(id)filter(where id>2 and id<=50) from table;

我想查找被此过滤器消除的记录

是的!我可以这样做来查找那些记录

select count(id)filter(where id<=2 or id>50) from table;

但是假设我有一个复杂的查询,例如,我在上述查询中用id替换了公式。

我现在有一个公式,可以根据不同的值计算三个不同的时间,如果我想每次都在某种条件下进行过滤,例如可以使用过滤器

这些是我的过滤器:

> start_time<= 40 mins and start_time> 5 mins 

> end_time<= 10 mins and end_time> 1 mins 

> journey_time<= 80 mins and journey_time> 10 mins

> Total_time(start_time+end_time+journey_time) <= 150 and Total_time(start_time+end_time+journey_time) > 15

如果要过滤,我必须写8次公式(每次和总时间都要过滤<和> =)这将是我的查询

select 
avg(start_time_formula)filter(where start_time_formula<= 40 and 
start_time_formula>5),
avg(end_time_formula)filter(where end_time_formula<= 10 and         
end_time_formula>1),
avg(journey_time_formula)filter(where journey_time_formula<= 80 and 
journey_time_formula>10)
from table
where (start_time_formula+end_time_formula+journey_time_formula <=150 and 
start_time_formula+end_time_formula+journey_time_formula > 15)

现在,如果我也想查找所有丢弃的值。

我是否必须再写8次相同的公式,以将>替换为<=,将“ AND”替换为“ OR”,这样才能给出丢弃的结果,还是有其他方法可以找到丢弃的值?

更新

我的表格值是

id     start_time            end_time         journey_time         Out_time  
 1  2018-04-06 01:37:36 2018-04-06 10:37:36 2018-04-06 04:37:36 2018-04-06 
    11:37:36
 2  2018-04-16 02:37:36 2018-04-16 08:37:36 2018-04-16 06:37:36  2018-04-16 
    07:37:36
 3  2018-05-10 01:37:36 2018-04-10 11:37:36 2018-04-06 09:37:36 2018-04-10 
    10:11:36
 4  2018-05-10 04:37:36 2018-05-10 5:00:36 2018-05-10 04:47:36  2018-05-10 
    05:5:36

我的计算是

  

开始时间=旅程时间-开始时间

     

旅途时间=结束时间-旅途时间

     

结束时间=结束时间-结束时间

这是我想要的输出

start_time           journey_time     end_time   discarded  
 10 mins              13 mins           5 mins      3

谢谢

1 个答案:

答案 0 :(得分:0)

使用情况时使用条件,因此您的查询将如下所示

select 
sum(case when start_time_formula <= 40 and start_time_formula>5 then 1 else 0 end),
sum(case when end_time_formula<= 10 and end_time_formula>1 then 1 else 0 end) ,
sum(case when where journey_time_formula<= 80 and journey_time_formula>10 then 1 else o end )
from table
where (start_time_formula+end_time_formula+journey_time_formula <=150 and 
start_time_formula+end_time_formula+journey_time_formula > 15)