我有一些数据会在一天中以正常的小时间隔将值(卷)记录到oracle sql数据库中。我正在寻找一个sql查询,可以找到过去发生的平均量,所以我可以根据过去的时间将其插入到新表中。例如,对于每个星期三晚上7点,只要我的数据集返回,我想找到当时所有星期三晚上7点的平均值,并将平均值输出到新记录。然后找到星期三晚上8点,然后是晚上9点等的平均录音,直到一周的所有7天都完成。
我主要不确定如何在sql中增加它。我认为我有一个会返回我想要的查询,但我不确定如何增加值并插入。
到目前为止,我在某一天的某个特定时段内有这个:
SELECT hour,day,AVG(volume)
FROM table
WHERE to_char(day, 'D') = 3 and hour = 19
GROUP BY hour,day;
答案 0 :(得分:0)
假设day
的类型为DATE
尝试这样的事情:
SELECT hour,to_char(day, 'D'), AVG(volume)
FROM table
WHERE to_char(day, 'D') = 3 and hour = 19
GROUP BY hour,to_char(day, 'D');
顺便说一句,你可能会使用
to_char(day, 'dy', 'NLS_DATE_LANGUAGE=ENGLISH') = 'wed'
而不是
to_char(day, 'D') = 3
因此,您的查询将不依赖于可能在不同环境中受到影响的nls参数 See example here
答案 1 :(得分:0)
如果我理解你的问题,你想对日和小时的所有组合运行上述查询。
此查询提供所有此类组合。
SELECT ds, LPAD (hrs, 2, '0') hrs
FROM ( SELECT LEVEL ds
FROM DUAL
CONNECT BY LEVEL <= 7),
( SELECT LEVEL - 1 hrs
FROM DUAL
CONNECT BY LEVEL <= 24)
ORDER BY ds, hrs;
所以,你的查询应该是这样的。
修改强>:
INSERT INTO avg_table (days, hours, avrg)
WITH xweek
AS (SELECT ds, LPAD (hrs, 2, '0') hrs
FROM ( SELECT LEVEL ds
FROM DUAL
CONNECT BY LEVEL <= 7),
( SELECT LEVEL - 1 hrs
FROM DUAL
CONNECT BY LEVEL <= 24))
SELECT t1.ds, t1.hrs, AVG (volume)
FROM xweek t1, tables t2
WHERE t1.ds = TO_CHAR (t2.day(+), 'D')
AND t1.hrs = t2.hour(+)
GROUP BY t1.ds, t1.hrs;
我已经形成了xweek,它返回日和小时的所有组合(24 * 7)。外部加入这个与有问题的表,我得到所有组合的平均值。