我在使用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');
如果您有更有效的解决方案,请告诉我。
答案 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_date
和end_date
之间的所有时间,也是1到2天之前的时间。