【问题标题】:SQL group by doesn't work when date in two columns两列中的日期时,SQL group by 不起作用
【发布时间】:2013-05-13 10:50:56
【问题描述】:

我有 3 列的表:agent_id、log_id、日期

|log_id |agent_id|date                 |
----------------------------------------
|0      |1037    |'2013-05-11 10:26:30'|
|1      |1041    |'2013-05-11 13:01:30'|
|0      |1029    |'2013-05-11 08:22:30'|
|0      |1058    |'2013-05-11 07:04:30'|
|0      |1087    |'2013-05-11 18:54:30'|
|1      |1039    |'2013-05-11 15:21:30'|
|0      |1056    |'2013-05-11 14:28:30'|
|0      |1039    |'2013-05-11 08:12:30'|

现在,我想对这个结果进行分组:
log_id = 1 然后在“登录”列中显示日期
log_id = 0 然后在“注销”列中显示日期

我写了sql查询

select 
agent_id,
CASE WHEN log_id = 0 THEN date
ELSE NULL
END as "logged in",
CASE WHEN log_id = 1 THEN date
ELSE NULL
END as "logged out"
FROM agents
group by agent_id, log_id, date

但它没有按预期工作。

|agent_id|logged_in           |logged_out          |
----------------------------------------------------
1041     |                    | 2013-05-11 13:01:30 
1029     |2013-05-11 08:22:30 |  
1039     |2013-05-11 08:12:30 |  
1058     |2013-05-11 07:04:30 |  
1039     |                    | 2013-05-11 15:21:30 
1056     |2013-05-11 14:28:30 |  
1087     |2013-05-11 18:54:30 |  
1037     |2013-05-11 10:26:30 |  

例如,agent_id = 1039 的logged_in 和logged_out 应该在一行中。

【问题讨论】:

  • 你应该阅读关键字left join
  • 您如何定义每个代理的登录和注销日期 - 如果有多个日期,您想包括哪一个?

标签: sql group-by case-when


【解决方案1】:

谢谢你@fyr 它有效

select 
a.agent_id,
li.date,
lo.date
FROM agents a
LEFT JOIN agents li ON (li.agent_id=a.agent_id and li.log_id = 0)
LEFT JOIN agents lo ON (lo.agent_id=a.agent_id and lo.log_id = 1)
group by a.agent_id, li.date, lo.date

【讨论】:

    【解决方案2】:

    您可以在CASE 中使用聚合函数。也不要GROUP BY log_id 因为值不同,你有一个01 值,这将在分组时导致不同的行:

    select agent_id,
      max(
          CASE 
            WHEN log_id = 0 THEN date
            ELSE NULL
          END) as "logged in",
      max(
          CASE 
            WHEN log_id = 1 THEN date
            ELSE NULL
          END) as "logged out"
    FROM agents
    group by agent_id;
    

    SQL Fiddle with Demo

    然后根据您的数据库,您可以将此查询进一步扩展为GROUP BY 日期,这意味着不包括时间的日期,因此您可以获得每天的登录或注销值。这是使用 MySQL 的示例查询:

    select agent_id,
      date_format(date, '%Y-%m-%d') date, 
      max(
          CASE 
            WHEN log_id = 0 THEN date
            ELSE NULL
          END) as "logged in",
      max(
          CASE 
            WHEN log_id = 1 THEN date
            ELSE NULL
          END) as "logged out"
    FROM agents
    group by agent_id, date_format(date, '%Y-%m-%d');
    

    Demo

    【讨论】:

      猜你喜欢
      • 2021-10-07
      • 2017-12-23
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多