Postgres从access_log表中获取数据时出错

时间:2017-11-06 08:30:38

标签: postgresql

错误: access_log.id 必须出现在GROUP BY子句中,或者在使用子查询时用于聚合函数中

select
    to_char(date_trunc('day',create_time),'DD MON, YYYY') as create_time,
    to_char((max(create_time) - min(create_time)),'HH24:mi') as time_spent,
    id
from 
    access_log
group by
    user_id, actionlink_id, date_trunc('day',create_time)

1 个答案:

答案 0 :(得分:0)

access_log.id对于该表中的每一行都是唯一的,因此您不太可能获得有用的信息,包括查询中的信息。我相信您打算通过user_id执行此操作。但是,错误消息告诉您实际情况, IF 您在id中包含select clause,它也应该出现在group by子句中。继续阅读:

select clause中的每个项目视为两种类型:

  1. 汇总这些是具有MIN MAX COUNT AVG和类似功能的
  2. 非聚合这些是没有这些功能的,这些决定了行的形成方式。 这些非聚合项中的每一项都应出现在group by子句中。这些列中的信息将用于创建最终结果的行结构。例如,不是每天的每个时间的行,现在每天的行数为#34;"因为您将date_trunc('day',create_time)包含在group by子句
  3. select
          user_id ---- changed this to user_id
        , actionlink_id  --- & added this 
        , to_char(date_trunc('day',create_time),'DD MON, YYYY') as create_time
    
        , to_char((max(create_time) - min(create_time)),'HH24:mi') as time_spent
        , MAX(id) as max_id
    from 
        access_log
    group by -- all non-aggregating select clause items go here
        user_id
      , actionlink_id
      , date_trunc('day',create_time)