在查询oracle数据库时进行分组

时间:2017-11-09 06:43:49

标签: oracle oracle11g

以下是我正在使用的查询。但是

  

查询:

SELECT   c.session_id     session_number, 
         u.first_name     first_name, 
         u.last_name      last_name, 
         Min(c.timestamp) session_start_ts, 
         Max(c.timestamp) session_end_ts, 
         Count( 
         CASE 
                  WHEN c.message_type='IN' THEN 1 
                  ELSE NULL 
         END)                  message_in_count, 
         Count(c.message_type) total_messages 
FROM     users u 
join     chatlog c 
ON       u.user_id = c.user_id 
WHERE    Trunc(c.timestamp) BETWEEN To_date('2017-10-11','YYYY-MM-DD') AND      To_date('2017-11-09','YYYY-MM-DD') 
GROUP BY c.session_id, 
order by timestamp;

问题在于它给出了一个错误,指出“不是GROUP BY表达式”。但是,如果我使用:

,而不是仅按会话ID进行分组
 group by c.session_id, u.first_name, u.last_name, c.timestamp

虽然first_name和last_name的值对于特殊情况session_id和timestamp是相同的,但我只取最大值。所以无法理解为什么我无法按session_id进行分组。

1 个答案:

答案 0 :(得分:1)

  

“无法理解为什么我无法按session_id分组”

Oracle聚合函数的规则是我们需要按所有分组投影中的非聚合列。在你的情况下是

bidirectional_edges(source_id)
  

“我们如何克服这一点。我的意思是必须有一种方法可以克服这一点。所以,如果你想选择多个列而只是按特定列分组?”

这不适用于您的情况。你说:

  

“first_name和last_name的值对于特定的(sic)session_id是相同的”

表示按group by c.session_id, u.first_name, u.last_name 分组与仅session_id,first_name,last_name分组相同。但作为一般观点,我们可以使用分析函数在与结果集不同的窗口中聚合值。 Find out more