挑战db表和查询

时间:2014-11-25 18:39:51

标签: sql postgresql between

我在使用SQL查询时遇到了一些挑战。我使用Postgresql开始。

我有一张桌子,我保留了#34;不可用"如果我无法从特定结果获得任何结果,则会显示实时服务的项目信息。我有开始和结束时间来获得每个项目的结果。

如果我从昨天到现在都无法获得任何结果,我将项目ID的start_time行更新为昨天,将end_time更新为now。如果我开始得到结果,我将end_time更新为时间戳,我开始得到结果。在那之后,我离开那一行。如果我再次开始获取NaN结果,我会插入一个带有新时间戳的新行。

我知道这是一个更新表格的复杂过程,这就是我在这里的原因。

我想对此表做的是:我需要获取特定时间范围内的不可用项目数,例如两天前和昨天之间。

所以这是我的问题:

select count(*) 
from (
select item_id from nan_value_report 
where 
start_time >=  CURRENT_TIMESTAMP - interval '2 days'
and end_time <= CURRENT_TIMESTAMP - interval '1 days'
and value = 'NaN' 
group by item_id)

我知道我不会包含两天前开始并且现在仍在继续的项目的NaN结果。我也需要将它们包括在我的结果中。效率也是另一个挑战,这个表包含9M行。

提前致谢。

          Item Id                          Start time        End time
     

&#34; 1890857284&#34 ;; 60310;;;&#34;&#34 ;;&#34;&#34 ;;&#34; 23:55&#34 ;;&#34;二〇一四年十一月十四日   12:25:00&#34;;&#34; 2014-11-15 12:20:00&#34 ;; 0   &#34; 1895585118&#34 ;; 114290;;;&#34;&#34 ;;&#34;&#34 ;;&#34; 23:55&#34 ;;&#34; 2014-11 -11   01:55:00&#34;;&#34; 2014-11-13 01:50:00&#34 ;; 0   &#34; 1831040276&#34 ;; 110582;;;&#34;&#34 ;;&#34;&#34 ;;&#34; 23:55&#34 ;;&#34; 2014-11 -11   06:10:00&#34;;&#34; 2014-11-13 06:05:00&#34 ;; 0   #&34; 1890866637&#34 ;; 62645;;;&#34;&#34 ;;&#34;&#34 ;;&#34; 23:55&#34 ;;&#34; 2014-11 -12   16:05:00&#34;;&#34; 2014-11-13 16:00:00&#34 ;; 0   #&34; 1890865290&#34 ;; 59356;;;&#34;&#34 ;;&#34;&#34 ;;&#34; 23:55&#34 ;;&#34; 2014-11 -15   01:45:00&#34;;&#34; 2014-11-16 01:40:00&#34 ;; 0   #&34; 1890858847&#34 ;; 56783;;;&#34;&#34 ;;&#34;&#34 ;;&#34; 23:55&#34 ;;&#34; 2014-11 -14   12:25:00&#34;;&#34; 2014-11-15 12:20:00&#34 ;; 0   #&34; 1890866262&#34 ;; 57834;;;&#34;&#34 ;;&#34;&#34 ;;&#34; 23:55&#34 ;;&#34; 2014-11 -14   12:25:00&#34;;&#34; 2014-11-15 12:20:00&#34 ;; 0


我想出了使用OR来包含我不能包含在前一个结果中的结果的想法。它有点慢但是有效:

select count(*) from
(select this.item_id
from nan_value_report this 
where 
(this.start_time >=  CURRENT_TIMESTAMP - interval '3 days' and this.end_time <= CURRENT_TIMESTAMP            - interval '2 days') or
(this.start_time <= CURRENT_TIMESTAMP - interval '2 days' and this.end_time >= CURRENT_TIMESTAMP - interval '2 days')
group by this.item_id, this.value
having this.value = 'NaN');

如果您有更有效的解决方案,请告诉我。

2 个答案:

答案 0 :(得分:0)

select count(*) grand_total, 
sum( case when value='NaN' then 1 else 0 end) NAN_TOTAL,
sum( case when value != 'Nan' then 1 else 0 end) NON_NAN_TOTAL,
from nan_value_report 
where 
this.start_time >=  CURRENT_TIMESTAMP - interval '2 days'
and this.end_time <= CURRENT_TIMESTAMP - interval '1 days'
and value = 'NaN' 

我不完全理解你的问题,所以我删除了#34;&#34; - 如果它有帮助,你可以把它添加回来,但也许我使用的语法会帮助你提供一个想法。

答案 1 :(得分:0)

我对你的时间范围限制有点不清楚。 如果你想在nan_value_report中有一个明确的item_id列表,其中(start_date..end_date)间隔与(2 day ago..1 day ago)间隔重叠,那么你只是使用了错误的逻辑重叠逻辑。你应该

WHERE start_time < (CURRENT_TIMESTAMP - interval '1 day')
  AND   end_time > (CURRENT_TIMESTAMP - interval '2 days')

这将匹配start_dateend_date之间的所有时间,也是1到2天之前的时间。