分组依据、IFNULL 和按日期排序

Posted

技术标签:

【中文标题】分组依据、IFNULL 和按日期排序【英文标题】:Group By, IFNULL and Order By date 【发布时间】:2021-12-07 08:23:33 【问题描述】:

我必须获取按类型分组的表中的行(如果它们不为空)和用户。按时间订购。但是分组必须分开...

这是我的桌子:

id event_code user time
10 A 6 2021-10-20 09:59:00
9 null 6 2021-10-20 09:56:00
8 null 6 2021-10-20 09:54:00
7 A 6 2021-10-20 09:53:00
6 A 6 2021-10-20 09:52:00
5 null 6 2021-10-20 09:51:00
4 null 4 2021-10-20 09:50:00
3 B 6 2021-10-20 09:49:00
2 B 6 2021-10-20 09:48:00
1 B 12 2021-10-20 09:43:00

我想得到这个:

id event_code user time number
10 A 6 2021-10-20 09:55:00 1
9 null 6 2021-10-20 09:54:00 1
8 null 6 2021-10-20 09:54:00 1
7,6 A 6 2021-10-20 09:53:00 2
5 null 6 2021-10-20 09:51:00 1
4 null 4 2021-10-20 09:50:00 1
3,2 B 6 2021-10-20 09:49:00 2
1 B 12 2021-10-20 09:43:00 1

【问题讨论】:

【参考方案1】:

我找到了这个解决方案:

SELECT GROUP_CONCAT(id),event_code,user,time FROM(
SELECT 
 id,event_code,user,time,
if(@a = event_code, @b, @b := @b + 1) as grouping_col,
@a := event_code
FROM testing
JOIN (select @a := 1, @b := 0) as temp
  ) as t
GROUP BY grouping_col,user

http://sqlfiddle.com/#!9/abfcd4/17

但是,我如何按时间对分组的行进行排序? 我会有 7,6 但我有 6,7。

【讨论】:

【参考方案2】:

@gasmor 要保持订单,您应该在 group_concat 子句中包含订单语句,更多信息请参见:https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_group-concat,例如:

    SELECT GROUP_CONCAT( id order by `time` desc),event_code,user,time 
FROM ( SELECT 
              id,
              event_code,
              `user`,
              `time`,
               if(@a = event_code, @b, @b := @b + 1) as grouping_col,
               @a := event_code
       FROM testing
JOIN ( 
      select @a := 1, @b := 0) as temp
      ) as t
GROUP BY grouping_col,user ;

演示:https://www.db-fiddle.com/f/vhqJXYFy52xRtVBc97R1EL/4

当你使用 group by 时,你应该记住:

所选列应属于 group by 或属于 SUMN()MAX()等聚合函数...

【讨论】:

以上是关于分组依据、IFNULL 和按日期排序的主要内容,如果未能解决你的问题,请参考以下文章

PySpark 聚合和分组依据

具有分组和按日期排序的复杂 sum()

MySQL-ISNULL()IFNULL()和NULLIF()函数

MYSQL常用函数str/date/ifnull

DQL查询语句

IFNULL只返回0,任何方式使这项工作?