'group by'适用于MySQL,但不适用于Oracle

Kev*_*vin 4 mysql oracle plsql group-by ora-00979

我有一个适用于MySQL的查询但不适用于Oracle,我正在尝试转换.这是我的表:

unique_row_id  http_session_id  page_name   page_hit_timestamp
----------------------------------------------------------------
0              123456789        index.html  2010-01-20 15:00:00
1              123456789        info.html   2010-01-20 15:00:05
2              123456789        faq.html    2010-01-20 15:00:15
3              987654321        index.html  2010-01-20 16:00:00
4              987654321        faq.html    2010-01-20 16:00:05
5              987654321        info.html   2010-01-20 16:00:15
6              111111111        index.html  2010-01-20 16:01:00
7              111111111        faq.html    2010-01-20 16:01:05
8              111111111        info.html   2010-01-20 16:01:15
Run Code Online (Sandbox Code Playgroud)

SQL是

select http_session_id, unique_row_id, page_name, page_hit_timestamp 
from page_hits 
group by http_session_id;
Run Code Online (Sandbox Code Playgroud)

在MySQL上,这将返回3行(每个唯一的http_session_id一行).

在Oracle上,我得到一个"ORA-00979:不是GROUP BY表达式"错误.我也尝试过与众不同,但我无法让它发挥作用.

为了清楚 - 我想要一个ResultSet,每个唯一的http_session_id包含一行.unique_row_id最好是最大值(例如http_session_id = 123456789为2),但这并不重要.

我快要把它分成多个单独的sql语句(一个"select distinct http_session_id",另一个迭代所有这些并选择max(unique_row_id).任何指针都会被感激地收到 - 我很想避免这个!

Rgds,凯文.

OMG*_*ies 10

您遇到ORA错误的原因是因为MySQL支持非标准GROUP BY子句,称其为"功能".它在这里记录.

标准SQL GROUP BY子句必须包含SELECT子句中指定的所有列,这些列不包含在GROUP BY子句中指定的聚合函数(LIKE COUNT,MAX/MIN等)中.

如果你想为每个http_session_id值设置一个唯一行 - 请查看使用ROW_NUMBER:

SELECT x.*
  FROM (select http_session_id, unique_row_id, page_name, page_hit_timestamp,
               ROW_NUMBER() OVER (PARTITION BY http_session_id 
                                      ORDER BY http_session_id) AS rank
          FROM page_hits) x
 WHERE x.rank = 1
Run Code Online (Sandbox Code Playgroud)