yuhuohu 发表于 2012-04-18 11:29

求效率最高的mysql语句

有一组人:甲乙丙丁...,
表中是每小时统计的他们的收入数据,
现在要求统计他们每天的汇总收入的单小时最高值

比如如下数据,统计完应该是
2012-04-10 的汇总收入的小时最高值13(11点时的甲乙丙丁小时收入的和:2+3+3+5=13)
2012-04-11 的汇总收入的小时最高值是22(发生在10点)

求sql语句。。。。

数据如下人   时间                        收入
甲   2012-04-1010:10:10      1
乙   2012-04-1010:10:10      2
丙   2012-04-1010:10:10      3
丁   2012-04-1010:10:10      4
甲   2012-04-1011:10:10      2
乙   2012-04-1011:10:10      3
丙   2012-04-1011:10:10      3
丁   2012-04-1011:10:10      5
甲   2012-04-1110:10:10      3
乙   2012-04-1110:10:10      6
丙   2012-04-1110:10:10      5
丁   2012-04-1110:10:10      8
甲   2012-04-1111:10:10      2
乙   2012-04-1111:10:10      3
丙   2012-04-1111:10:10      3
丁   2012-04-1111:10:10      5

junsansi 发表于 2012-04-18 11:29

写了个示例:
mysql> select * from t;
+------+---------------------+--------+
| u    | date                | salary |
+------+---------------------+--------+
| a    | 2012-04-10 10:10:10 |      1 |
| b    | 2012-04-10 10:10:10 |      2 |
| c    | 2012-04-10 10:10:10 |      3 |
| d    | 2012-04-10 10:10:10 |      4 |
| a    | 2012-04-10 11:10:10 |      2 |
| b    | 2012-04-10 11:10:10 |      3 |
| c    | 2012-04-10 11:10:10 |      3 |
| d    | 2012-04-10 11:10:10 |      5 |
| a    | 2012-04-11 10:10:10 |      3 |
| b    | 2012-04-11 10:10:10 |      6 |
| c    | 2012-04-11 10:10:10 |      5 |
| d    | 2012-04-11 10:10:10 |      8 |
| a    | 2012-04-11 11:10:10 |      2 |
| b    | 2012-04-11 11:10:10 |      3 |
| c    | 2012-04-11 11:10:10 |      3 |
| d    | 2012-04-11 11:10:10 |      5 |
+------+---------------------+--------+
16 rows in set (0.00 sec)

mysql> select date(date),max(ss) from(
    -> select date,sum(salary) ss from t group by date) a group by date(date);
+------------+---------+
| date(date) | max(ss) |
+------------+---------+
| 2012-04-10 |      13 |
| 2012-04-11 |      22 |
+------------+---------+
2 rows in set (0.00 sec)

junsansi 发表于 2012-04-18 11:50

我感觉这个终极优化不在SQL层面啊,如果用SQL层面标准的分组统计,取最大值就是最简化的写法了~~

yuhuohu 发表于 2012-04-18 12:22

回复 3# junsansi


    这个好用,可我还想知道是哪个时间点发生最大值,有办法吗

RogerZhuo 发表于 2012-04-18 13:11

回复 4# yuhuohu
根据三思大哥的Sql, 作一点修改就可以满足你 的要求了,
不过个人优化一下,如果这个只是报表还行,实时查询的话,表设计就有问题了。
还有lz大哥这么多分,才给5分:dizzy:


mysql> select * from t_group;
+------+---------------------+--------+
| user | time                | salary |
+------+---------------------+--------+
| a    | 2012-04-10 10:10:10 |      1 |
| b    | 2012-04-10 10:10:10 |      2 |
| c    | 2012-04-10 10:10:10 |      3 |
| d    | 2012-04-10 10:10:10 |      4 |
| a    | 2012-04-11 22:10:10 |   50 |
| b    | 2012-04-11 11:10:10 |   12 |
| b    | 2012-04-10 11:10:10 |   12 |
+------+---------------------+--------+
7 rows in set (0.00 sec)

mysql> select time ,max(ss) from (select time,sum(salary) ss from t_group group by date_format(time,'%Y-%m-%d:%k') )a group by date(time);
+---------------------+---------+
| time                | max(ss) |
+---------------------+---------+
| 2012-04-10 10:10:10 |      12 |
| 2012-04-11 11:10:10 |      50 |
+---------------------+---------+
2 rows in set (0.00 sec)

   

RogerZhuo 发表于 2012-04-18 13:29

子查询的中的分组精确到每天的小时(24小时制), 外层再以日期分组求当天的Max值,也就是子查询中的小时每组中最大值的,

yuhuohu 发表于 2012-04-18 13:57

RogerZhuo 发表于 2012-04-18 13:11 static/image/common/back.gif
回复 4# yuhuohu
根据三思大哥的Sql, 作一点修改就可以满足你 的要求了,
不过个人优化一下,如果这个只 ...

谢谢哥们,其实我是点错了才点到悬赏的{:2_179:}

RogerZhuo 发表于 2012-04-18 14:01

回复 7# yuhuohu
:luya: 不客气, 开玩笑的呢

   

yuhuohu 发表于 2012-04-18 14:33

;P

jmyychen 发表于 2012-05-03 12:56

这么快就解决了?、
页: [1] 2
查看完整版本: 求效率最高的mysql语句