【问题标题】:Query for group by rows but keeping the minimum date按行查询分组但保持最小日期
【发布时间】:2017-01-20 11:38:25
【问题描述】:

我有下一张数据表:

user     group     dt_action
-----    -----     ---------
John     salvage   2016-3-2
Dennis   fire      2016-1-1
Martha   fire      2016-12-23
John     rescue    2016-1-20
John     salvage   2017-1-26
Developer NULL     2016-5-6
Dennis   several   2016-4-29
Martha   fire      2003-1-1

我的想法是按“组”类别进行分组,计算每个用户的群组数量,但在日期时间字段上,我想保持每个组的最小日期汇总。结果应该是这样的:

user      group   count_group     dt_action_min
----      -----   -----------    -------------
John      salvage     2           2016-3-2
John      rescue      1           2016-1-20
Dennis    fire        1           2016-1-1
Dennis    several     1           2016-4-29
Martha    fire        2           2003-1-1
Developer NULL        1           2016-5-6

这是一个很久以前偷走我梦想的查询,但我可以得到它! 非常感谢,

丹妮

【问题讨论】:

  • 你尝试了什么?究竟是什么让你头疼?
  • 您想要做的不仅仅是获取每个组的信息,还包括每个用户和组的信息。因此,您必须按用户和组进行分组。然后只需使用 count 和 min 函数。

标签: mysql date group-by


【解决方案1】:

创建表/插入数据

CREATE TABLE DATA
    (`user` VARCHAR(9), `group` VARCHAR(7), `dt_action` VARCHAR(10))
;

INSERT INTO DATA
    (`user`, `group`, `dt_action`)
VALUES
    ('John', 'salvage', '2016-3-2'),
    ('Dennis', 'fire', '2016-1-1'),
    ('Martha', 'fire', '2016-12-23'),
    ('John', 'rescue', '2016-1-20'),
    ('John', 'salvage', '2017-1-26'),
    ('Developer', NULL, '2016-5-6'),
    ('Dennis', 'several', '2016-4-29'),
    ('Martha', 'fire', '2003-1-1')
;

查询

用你自己的表名替换数据

SELECT
    `data`.`user`
  , `data`.`group`
  , `data_group`.`count_group`
  , `data_group`.`min_dt_action`
FROM
 `data` 
INNER JOIN (
  SELECT
     `data`.user
   , `data`.`group` 
   , COUNT(*) count_group
   , MIN(`data`.`dt_action`) min_dt_action
  FROM 
   `data`
  GROUP BY
     `data`.user
   , `data`.`group` 
) data_group
ON
 `data`.`user` = data_group.`user`
AND
  `data`.dt_action = data_group.min_dt_action
ORDER BY 
 `data_group`.`count_group` DESC

结果

user       group    count_group  min_dt_action  
---------  -------  -----------  ---------------
Martha     fire               2  2003-1-1       
John       salvage            2  2016-3-2       
John       rescue             1  2016-1-20      
Developer  (NULL)             1  2016-5-6       
Dennis     fire               1  2016-1-1       
Dennis     several            1  2016-4-29       

【讨论】:

  • 完美,@Rayomnd Niijland。似乎工作正常!我的问题是为什么您称为“data_group”的内部查询不是唯一需要这样做的,因为您是按 dt_action 的最小值进行分组的。你知道为什么只使用内部查询时没有得到最小日期吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多