非聚合列、SUM、MAX 和 GROUP BY

科菲黑色

我有以下活动表。

CREATE TABLE IF NOT EXISTS activity(  
user_id int(11) unsigned NOT NULL,  
create_date date NOT NULL,  
start_time int(4) NOT NULL,
field_1 int(4),
field_2 int(4),  
field_3 int(4),
PRIMARY KEY (user_id, create_date, start_time)  
);

insert into activity (user_id, create_date,start_time, field_1, field_2, field_3) values  
(1, '2017-03-01', 0, 1, 1, 1),  
(1, '2017-03-01', 30, 2, 2, 2),  
(1, '2017-03-01', 60, 3, 3, 3),  
(1, '2017-03-02', 0, 4, 4, 4),  
(1, '2017-03-02', 30, 5, 5, 5),  
(1, '2017-03-02', 60, 6, 6, 6),  
(1, '2017-03-03', 0, 7, 7, 7),  
(1, '2017-03-03', 30, 8, 8, 8),  
(1, '2017-03-03', 60, 9, 9, 9),    
(2, '2017-03-04', 0, 1, 1, 1),  
(2, '2017-03-04', 30, 2, 2, 2),  
(2, '2017-03-04', 60, 3, 3, 3),  
(2, '2017-03-05', 0, 4, 4, 4),  
(2, '2017-03-05', 30, 5, 5, 5),  
(2, '2017-03-05', 60, 6, 6, 6),  
(2, '2017-03-06', 0, 7, 7, 7),  
(2, '2017-03-06', 30, 8, 8, 8),  
(2, '2017-03-06', 60, 9, 9, 9)  

从活动中选择*;

| user_id | create_date | start_time | field_1 | field_2 | field_3 |    
|       1 | 2017-03-01  |          0 |       1 |       1 |       1 |  
|       1 | 2017-03-01  |         30 |       2 |       2 |       2 |  
|       1 | 2017-03-01  |         60 |       3 |       3 |       3 |  
|       1 | 2017-03-02  |          0 |       4 |       4 |       4 |  
|       1 | 2017-03-02  |         30 |       5 |       5 |       5 |  
|       1 | 2017-03-02  |         60 |       6 |       6 |       6 |  
|       1 | 2017-03-03  |          0 |       7 |       7 |       7 |  
|       1 | 2017-03-03  |         30 |       8 |       8 |       8 |  
|       1 | 2017-03-03  |         60 |       9 |       9 |       9 | 
|       2 | 2017-03-04  |          0 |       1 |       1 |       1 |  
|       2 | 2017-03-04  |         30 |       2 |       2 |       2 |  
|       2 | 2017-03-04  |         60 |       3 |       3 |       3 |  
|       2 | 2017-03-05  |          0 |       4 |       4 |       4 |  
|       2 | 2017-03-05  |         30 |       5 |       5 |       5 |  
|       2 | 2017-03-05  |         60 |       6 |       6 |       6 |  
|       2 | 2017-03-06  |          0 |       7 |       7 |       7 |  
|       2 | 2017-03-06  |         30 |       8 |       8 |       8 |  
|       2 | 2017-03-06  |         60 |       9 |       9 |       9 |  

我想要的是每个user_id,field_1、field_2、field_3的总和最大的日期。在上面的例子中,查询结果应该是

| user_id | create_date | best_active_time |  
|       1 | 2017-03-03  | 72               |  
|       2 | 2017-03-06  | 72               | 

该问题与获取非聚合列 (create_date) 和使用 GROUP BY 子句有关。目前,我有我的解决方案,我只是想知道是否存在更好的解决方案(我觉得它们存在)。

SELECT bb.user_id, bb.create_date, cc.best_active_time FROM   
(  
SELECT user_id, create_date, MAX(active_time) best_active_time FROM  
(SELECT user_id, create_date, (SUM(field_1) + SUM(field_2) + SUM(field_3)) as   active_time  FROM activity GROUP BY user_id, create_date) ACT GROUP BY user_id, create_date  
) bb  
INNER JOIN  
(  
SELECT user_id,  MAX(active_time) best_active_time FROM  
(SELECT user_id, (SUM(field_1) + SUM(field_2) + SUM(field_3)) as active_time    FROM activity GROUP BY user_id, create_date) ACT GROUP BY user_id  
) cc ON bb.user_id = cc.user_id AND bb.best_active_time = cc.best_active_time   
Juan Carlos Oropeza 占位符图像

row_number()在mysql中可以使用变量进行模拟

SQL 演示

SELECT *
FROM (
        SELECT a.*,
               @rn := if(@user = user_id, 
                         @rn + 1 ,
                         if(@user := user_id,1,1)
                        ) as rn
        FROM (        
                SELECT user_id, create_date, SUM(field_1 + field_2 + field_3) as total
                FROM activity a
                GROUP BY user_id, create_date
             ) a
        CROSS JOIN (SELECT @user := 0, @rn := 0) as t
        ORDER BY user_id, total DESC
    ) t
WHERE rn =1  

输出:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL GROUP BY和SUM

来自分类Dev

SUM(),GROUP BY和WHERE

来自分类Dev

SUM和GROUP BY问题

来自分类Dev

使用$ group stage和$ sum运算符进行聚合

来自分类Dev

具有SUM,GROUP BY和JOIN的SQL聚合(多对多)

来自分类Dev

使用$ group stage和$ sum运算符进行聚合

来自分类Dev

mongodb与$ group和$ lookup聚合

来自分类Dev

来自AS列的MySQL SUM和GROUP BY

来自分类Dev

GROUP BY HAVING 和 SELECT MAX() GROUP BY 的区别

来自分类Dev

SQL MAX和GROUP BY与WHERE

来自分类Dev

SQL group by和max等字段

来自分类Dev

SQL MAX和GROUP BY与WHERE

来自分类Dev

MySQL GROUP BY和SUM排名

来自分类Dev

Symfony - Mongodb - sum 和 group by

来自分类Dev

为什么 CROSS APPLY 与列和聚合函数需要 Group by

来自分类Dev

使用MAX()和SUM()聚合的SQL查询

来自分类Dev

如何合并聚合函数Sum()和Max()

来自分类Dev

无法开始$ match和$ group MongoDB聚合

来自分类Dev

Mongodb聚合按id和group匹配

来自分类Dev

使用 GROUP BY 和聚合条件删除

来自分类Dev

MySQL-使用GROUP BY和SUM将两列相乘

来自分类Dev

GROUP_BY,MAX()和only_full_group_by

来自分类Dev

类似SQL的MAX和GROUP BY字典列表

来自分类Dev

使用MAX DATE和GROUP BY提取行

来自分类Dev

聚合函数GROUP BY和SUM返回不一致的数据吗?

来自分类Dev

sql 聚合 - COUNT(*)、SUM()、AVG() 和 GROUP BY 作为关键字

来自分类Dev

MongoDB用$ sum汇总$ match和$ group

来自分类Dev

在angularjs中执行Group By和Sum by属性

来自分类Dev

Django Group_By和SUM查询