免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 42940 | 回复: 25
打印 上一主题 下一主题

请教min(),max()等与group by一起的情况 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-27 13:56 |只看该作者 |倒序浏览
新手的问题:

假如有如下形式的表记录了员工的ID号,日期,生产率


+----------+------------+---------------+
| work-id | prod_dat | prod_num) |
+----------+------------+---------------+
| 3396   | 2008-01-02 |        128 |        
| 3396   | 2008-01-03 |        123 |      
| 3396   | 2008-01-04 |         132|      
| 3397   | 2008-01-02 |         56  |        
| 3397   | 2008-01-03 |        43   |        
| 3397   | 2008-01-04 |         77  |         
| 3397   | 2008-01-05 |        62   |        


那么可以方便的找出员工最大和最小生产率,如

select work-id,max(prod_dat),min(prod_num)
from table_name
group by 1

但是如果我想同时找出最大及最小生产率所对应的日期,该怎么写这个查询?

试了半天都失败,不知如何下手。

试过加入子查询,但是结果总不正确。

mysql的手册还是较为简略,主要是语法,没有提供相关的SQL查询技巧。

请费心指教,谢谢!

另外,有关SQL的查询技巧,哪一本书较为全面,适合我这样入门新手级别学习的?可以的话,烦请一并推荐!

论坛徽章:
0
2 [报告]
发表于 2008-02-27 14:39 |只看该作者
select work_id, max(prod_num), min(prod_num) from table_name group by work_id;

不知道我理解你的意思没

论坛徽章:
0
3 [报告]
发表于 2008-02-27 15:01 |只看该作者
mysql> select a.work_id,a.prod_date from table_name as a where a.prod_num = (select max(prod_num) from table_name where work_id = a.work_id );
+---------+------------+----------+
| work_id | prod_date  | prod_num |
+---------+------------+----------+
|    3396 | 2008-01-04 |      132 |
|    3397 | 2008-01-04 |       77 |
+---------+------------+----------+
2 rows in set (0.03 sec)

mysql> select * from table_name as a where a.prod_num = (select min(prod_num) from table_name where work_id = a.work_id );
+---------+------------+----------+
| work_id | prod_date  | prod_num |
+---------+------------+----------+
|    3396 | 2008-01-03 |      123 |
|    3397 | 2008-01-03 |       43 |
+---------+------------+----------+
2 rows in set (0.00 sec)

论坛徽章:
0
4 [报告]
发表于 2008-02-27 15:02 |只看该作者
如果想放到一句的话

mysql> select a.work_id,a.prod_date as max_date,a.prod_num as max_num,b.prod_date as min_date,b.prod_num as min_num from (select * from table_name as a where a.prod_num = (select max(prod_num) from table_name where work_id = a.work_id
)) as a,(select * from table_name as a where a.prod_num = (select min(prod_num) from table_name where work_id = a.work_id )) as b where a.work_id = b.work_id;
+---------+------------+---------+------------+---------+
| work_id | max_date   | max_num | min_date   | min_num |
+---------+------------+---------+------------+---------+
|    3396 | 2008-01-04 |     132 | 2008-01-03 |     123 |
|    3397 | 2008-01-04 |      77 | 2008-01-03 |      43 |
+---------+------------+---------+------------+---------+
2 rows in set (0.00 sec)


[ 本帖最后由 yueliangdao0608 于 2008-2-27 15:13 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-02-27 15:34 |只看该作者
2楼的可能没有看太清我的意思

3/4楼的yueliangdao0608写得非常清楚,感谢!

我正是觉得困难,考虑先象3楼那样分别来查询;4楼的查询结果是最终要达到的目标

很好很完美!  

再次感谢!

论坛徽章:
0
6 [报告]
发表于 2008-02-27 15:51 |只看该作者

回复 #1 col.g 的帖子

实在看不出

select work-id,max(prod_dat),min(prod_num)
from table_name
group by 1

能得出员工最大和最小生产率

如果prod_num就是指的就是生产率的话,max里面用错了吧。group by用得也令人费解。

从目前的情况来看,需求不明,无从解起

论坛徽章:
0
7 [报告]
发表于 2008-02-27 18:43 |只看该作者
回6楼:

应该不叫生产率,就是某个员工最大的prod_num及最小的prod_num

查询结果如下:

+---------+------------+---------------+
| work_id| max_num|    min_num |
+---------+------------+---------------+
|    3396 |         132 |             123 |
|    3397 |           77 |               43 |
+---------+------------+---------+-----+

而我想达到的目的正是4楼的那个结果


回4楼:
由于我的表有二百多万行,结果这个查询跑了3个小时都没跑出来,只好先停了。我的是笔记本,这个查询一跑起来,完全动不了,只好先停了。尝试其它方法。

论坛徽章:
0
8 [报告]
发表于 2008-02-27 18:49 |只看该作者
再回6楼:

确实那个是写错了,应该是

select work-id,max(prod_num),min(prod_num)
from table_name
group by 1

这里用group by work-id的意思,是因为有很多的work-id,每个work-id在每一天又有一条记录。而我想要的是针对每个work-id统计出他的最大prod_num和最小prod_num,所以用group by 1。

如果不用group by 1 ,那么只返回一条记录,得到的是全部work-id里最大的prod_num和最小的prod_num,那不是我的本意了。所以group by 1应该是用得没有问题。

论坛徽章:
0
9 [报告]
发表于 2008-02-28 09:20 |只看该作者
贴出你的EXPLAIN结果来

论坛徽章:
0
10 [报告]
发表于 2008-02-28 11:31 |只看该作者

回复 #8 col.g 的帖子

group by 1 这种写法将要被废弃,还是少写比较好
你那个表没有主键,硬写出来效率肯定不会高。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP