如果AVG​​(7天记录数)>(今天的记录数),则执行SQL查询以返回数据

时间:2018-12-17 15:36:41

标签: sql oracle

我想在 Oracle数据库中为以下项编写SQL查询:

priceindex(字段名称)每天大约有120条记录(例如),如果最近7天的平均记录计数大于priceindex(组)的今天记录计数,我必须显示priceindex名称和今天的日期通过priceindex)。

基本上,价格指数将为56,并且每个索引每天应该有大约120条记录,并且每天都会从外部站点转储到数据库中。因此,要确保每天都将所有记录下载到数据库中。

1 个答案:

答案 0 :(得分:3)

除了我在对您的问题的评论中要求进行的澄清(与“如何在今天还没有结束时才能知道今天的最终计数”有关)之外,可以按照以下方式解决此问题。未经测试,自您没有提供示例数据。

从表中,仅选择相关DATE在“今天”-7和“今天”之间的行(因此实际上有8天:今天和今天之前的7天)。然后按PRICEINDEX分组。计算每个组的总行数,仅计算“今天”的行数。 “今天”的行应少于总数的1/8倍(这是简单的代数:等于少于其他天数的1/7倍)。

此类条件在组级别上必须位于HAVING子句中。

select   priceindex
from     your_table
where    datefield >= trunc(sysdate) - 7 and datefield < trunc(sysdate) + 1
group by priceindex
having   count(case when datefield >= trunc(sysdate) then 1 end) < 1/8 * count(*)
;

编辑:OP澄清了查询每天在午夜运行;这意味着“今天”实际上应指“昨天”(刚刚结束的日期)。在Oracle中,可能在所有计算中,午夜属于BEGINS在午夜开始的那一天,而不是在午夜结束的那一天。午夜的时间是新的开始的00:00:00,而不是24:00:00。

因此,上面的查询必须稍作更改:

select   priceindex
from     your_table
where    datefield >= trunc(sysdate) - 8 and datefield < trunc(sysdate)
group by priceindex
having   count(case when datefield >= trunc(sysdate) - 1 then 1 end)
         < 1/8 * count(*)
;