Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用oracle sql聚合每月数据库和以前的数据_Sql_Database_Oracle_Group By_Average - Fatal编程技术网

如何使用oracle sql聚合每月数据库和以前的数据

如何使用oracle sql聚合每月数据库和以前的数据,sql,database,oracle,group-by,average,Sql,Database,Oracle,Group By,Average,假设我们有一个简单的表“示例”,如下所示: id time 1 2-2-20 2 3-1-20 3 15-2-20 4 20-3-20 我希望每月对包含上月数据的行进行计数,并获得每月的平均数据(除以指定月份的行): month rows_num avg_per_day 1-20 1 1/31 2-20 2+1 2/29 3-20 2+1+1 1/31 我正在考虑是否可以像这样使用sql,但不包含上个月的数据,也不知道如何处理平均

假设我们有一个简单的表“示例”,如下所示:

id  time 
1  2-2-20 
2  3-1-20
3  15-2-20
4  20-3-20
我希望每月对包含上月数据的行进行计数,并获得每月的平均数据(除以指定月份的行):

month rows_num avg_per_day
1-20    1        1/31
2-20    2+1      2/29
3-20    2+1+1    1/31
我正在考虑是否可以像这样使用sql,但不包含上个月的数据,也不知道如何处理平均值:

按trunc(截止日期(trunc(时间)),“月”)从示例组中选择计数(*)

有人能帮我吗?

您可以使用:

select to_char(time, 'yyyy-mm') as month,
       sum(count(*)) over (order by min(time)) as rows_num,
       count(*) / extract(day from last_day(time))
from t
group by to_char(time, 'yyyy-mm'), extract(day from last_day(time))
order by min(time);

我对月份的格式有点不同,但您可以按照自己的喜好进行格式设置。

尽管查询的输出看起来相当简单,但编写内联视图以生成可在外部选择中使用的值可能是一个优势,例如(使用您的示例表)

表和数据

create table example ( id,  day_ )
as
select 1, date '2020-02-02' from dual union all --  2-2-20
select 2, date '2020-01-03' from dual union all --  3-1-20
select 3, date '2020-02-15' from dual union all -- 15-2-20
select 4, date '2020-03-20' from dual           -- 20-3-20
;
第一步(将其用于“内联视图”)

最终查询

select
  month_
, runningtotal_ rows_num
, round( max( rn_ )  / lastday_, 5 ) avg_per_day
, to_char( max( rn_ )  ) || '/' || to_char( lastday_ ) avg_per_day
from (
  select
    to_char( day_, 'MM-YY') month_
  , to_char( extract ( day from last_day( day_ ) ) ) lastday_
  , count(*) over ( order by to_char( day_, 'MM-YY') ) runningtotal_
  , row_number() over ( partition by  to_char( day_, 'MM-YY')  order by day_ ) rn_
  from example
)
group by month_, runningtotal_, lastday_
order by month_
;

-- result 
+------+--------+-----------+-----------+
|MONTH_|ROWS_NUM|AVG_PER_DAY|AVG_PER_DAY|
+------+--------+-----------+-----------+
|01-20 |1       |0.03226    |1/31       |
|02-20 |3       |0.06897    |2/29       |
|03-20 |4       |0.03226    |1/31       |
+------+--------+-----------+-----------+
拉小提琴


注:不太清楚(对我来说)您需要哪种形式的“平均每天”。只需从外部选择中删除不需要的行。

谢谢,这真的很有帮助。但数千个数据的结果并不正确。但我终于解决了。嗨,戈登。谢谢你的回答。当我尝试运行您的sql时,结果是“00979.00000-”而不是表达式分组。“@yimkong。固定的。一个月的最后一天也需要在
组中(因为它是常量,所以不会影响任何事情)。
select
  month_
, runningtotal_ rows_num
, round( max( rn_ )  / lastday_, 5 ) avg_per_day
, to_char( max( rn_ )  ) || '/' || to_char( lastday_ ) avg_per_day
from (
  select
    to_char( day_, 'MM-YY') month_
  , to_char( extract ( day from last_day( day_ ) ) ) lastday_
  , count(*) over ( order by to_char( day_, 'MM-YY') ) runningtotal_
  , row_number() over ( partition by  to_char( day_, 'MM-YY')  order by day_ ) rn_
  from example
)
group by month_, runningtotal_, lastday_
order by month_
;

-- result 
+------+--------+-----------+-----------+
|MONTH_|ROWS_NUM|AVG_PER_DAY|AVG_PER_DAY|
+------+--------+-----------+-----------+
|01-20 |1       |0.03226    |1/31       |
|02-20 |3       |0.06897    |2/29       |
|03-20 |4       |0.03226    |1/31       |
+------+--------+-----------+-----------+