Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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_Oracle_Group By - Fatal编程技术网

Oracle SQL-平均函数的最大值

Oracle SQL-平均函数的最大值,sql,oracle,group-by,Sql,Oracle,Group By,我有一张桌子: day |visitors_number -------------|--------------- 02/01/2020 |250 ... 说明: 1.一周中每一天的平均访客人数将一周中的某一天记录为文本:星期一, 星期二等等。。 我做到了: 一周中哪一天的平均参观人数最多? 我想使用上一个查询,但不想回写它。代码应该尽可能简单,使用MAX函数。先谢谢你。 我认为这是一个可以在外部查询中使用ROWNUM的查询。看看这个例子: 选择周中的子日期, ROUN

我有一张桌子:

day          |visitors_number
-------------|---------------
02/01/2020   |250
...
说明: 1.一周中每一天的平均访客人数将一周中的某一天记录为文本:星期一, 星期二等等。。 我做到了:

一周中哪一天的平均参观人数最多? 我想使用上一个查询,但不想回写它。代码应该尽可能简单,使用MAX函数。先谢谢你。
我认为这是一个可以在外部查询中使用ROWNUM的查询。看看这个例子:

选择周中的子日期, ROUNDsub.avg_访问者编号,0作为avg_访问者编号 从选择到CHARd.day,“day”作为每周的第天, AVGd.visitors\u number作为AVG\u visitors\u number 来自丹麦 分组到CHARd.day,“day” 按平均访客数量说明订购 其中ROWNUM=1; 下面是这个例子的一个例子

查询获取您的排序结果,并仅选择第一行。需要注意的一点是,我建议在排序之后再进行一轮,以便获得最准确的结果。

以下是一些选项

首先是样本数据:

SQL> create table dane2_ as
  2    (select trunc(sysdate, 'mm') + level - 1 day,
  3            round(dbms_random.value(1, 10)) visitors_number
  4     from dual
  5     connect by level <= 14
  6    );

Table created.

SQL> select * From dane2_ order by day;

DAY        VISITORS_NUMBER
---------- ---------------
01.04.2020               9
02.04.2020               5
03.04.2020               8
04.04.2020               1
05.04.2020               6
06.04.2020               1
07.04.2020               9
08.04.2020               9
09.04.2020               5
10.04.2020               4
11.04.2020               7
12.04.2020               6
13.04.2020               4
14.04.2020               5

14 rows selected.
要与MAX函数一起使用的选项:

SQL> with temp as
  2    (select day,
  3       to_char(day, 'FMDay', 'nls_date_language=english') as day_written,
  4       visitors_number
  5     from dane2_
  6    ),
  7  avgs as
  8    (select day_written,
  9       round(avg(visitors_number)) as avg_visitors_number
 10     from temp
 11     group by day_written
 12    )
 13  select a.day_written
 14  from avgs a
 15  where a.avg_visitors_number = (select max(b.avg_visitors_number)
 16                                 from avgs b
 17                                );

DAY_WRITTEN
------------------------------------
Wednesday
或者,您可以按降序排列它们并获取第一个:

SQL> with temp as
  2    (select day,
  3       to_char(day, 'FMDay', 'nls_date_language=english') as day_written,
  4       visitors_number
  5     from dane2_
  6    ),
  7  avgs as
  8    (select day_written,
  9       round(avg(visitors_number)) as avg_visitors_number,
 10       rank() over (order by round(avg(visitors_number)) desc) rnk
 11     from temp
 12     group by day_written
 13    )
 14  select day_written
 15  from avgs
 16  where rnk = 1;

DAY_WRITTEN
------------------------------------
Wednesday

SQL>

你说的不写是什么意思?按原样,您只需在查询结束时添加FETCH FIRST ROW WITH TIES,即可获得具有最大平均访客数的天数。我想使用MAX函数而不是FETCH。您想让它更复杂吗?好的:-最简单的就是你的平均值的最大值。如果您也不想使用窗口函数,那么您应该将查询作为主查询和子查询使用两次,最好使用with子句编写。
SQL> with temp as
  2    (select day,
  3       to_char(day, 'FMDay', 'nls_date_language=english') as day_written,
  4       visitors_number
  5     from dane2_
  6    ),
  7  avgs as
  8    (select day_written,
  9       round(avg(visitors_number)) as avg_visitors_number
 10     from temp
 11     group by day_written
 12    )
 13  select a.day_written
 14  from avgs a
 15  where a.avg_visitors_number = (select max(b.avg_visitors_number)
 16                                 from avgs b
 17                                );

DAY_WRITTEN
------------------------------------
Wednesday
SQL> with temp as
  2    (select day,
  3       to_char(day, 'FMDay', 'nls_date_language=english') as day_written,
  4       visitors_number
  5     from dane2_
  6    ),
  7  avgs as
  8    (select day_written,
  9       round(avg(visitors_number)) as avg_visitors_number,
 10       rank() over (order by round(avg(visitors_number)) desc) rnk
 11     from temp
 12     group by day_written
 13    )
 14  select day_written
 15  from avgs
 16  where rnk = 1;

DAY_WRITTEN
------------------------------------
Wednesday

SQL>