利用sql查询每组第一个数据

  今天在一个.NET群里看到有个人问如何查找到每组第一个人的全部信息,当时自己也在忙着公司的和学校的需求报告,但是自己也是希望尝试一下的,就让他先把数据库给我,在完成了该完成任务的时候,我还是很乐意的帮助那些需要帮助的人了,可是还是挺悲剧的,我的Sql2008打不开他的数据库(因为Sql2008支持智能提示,所有现在用的是Sql2008)。跟他交流了一下,才知道数据库没有多少数据,那我还不如自己写脚本来解决这个问题。当然还是脱离不了互联网的,最好把写好的代码和大家分享一下。

 

题目大概的意思是这样的,找出每组老师(Teacher)的最大的Uid的数据。

 1 --创建一个数据库
2 CREATE DATABASE MyStudySql
3 GO
4
5 --创建表
6 CREATE TABLE DOGroupByFirstTable(
7 [Uid] INT IDENTITY NOT NULL PRIMARY KEY,   --主键
8 Student nvarchar(10) NOT NULL, --学生姓名
9 Teacher nvarchar(10) NOT NULL --老师姓名
10 )
11 GO
12
13 --插入数据
14 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小童','小吴');
15 GO
16 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小童','小王');
17 GO
18 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小童','小黄');
19 GO
20 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小林','小吴');
21 GO
22 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小林','小王');
23 GO
24 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小林','小黄');
25 GO
26 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小徐','小吴');
27 GO
28 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小徐','小王');
29 GO
30 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小徐','小黄');
31 GO
32 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小黑','小吴');
33 GO
34 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小白','小王');
35 GO
36 INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小兰','小黄');
37 GO
38
39 --测试插入的数据
40 SELECT * FROM DOGroupByFirstTable
41
42 --查找每组老师中最大的Uid
43 SELECT *
44 FROM DOGroupByFirstTable AS temp
45 WHERE temp.Student IN
46 (SELECT TOP 1 Student
47 FROM DOGroupByFirstTable
48 WHERE temp.Teacher=[Teacher] --这里是以老师为相等,就是你需要分组的对象
49 ORDER BY [Uid] DESC --查找最大的Uid,即你需要查找的最大(或者是最小)的数据
50 )

  当然问题解决了不是就完事了,你还是需要学习的是一种风格,说道风格,我想你第一个感觉就是换行和tab键的使用了,但这些真的是太基础了,我这里就不介绍了。这里不知道大家注意到没有,这里的关键字我都是大写的,当然你用小写也不会有事(因为sql不区分大小写),但是当我们在没有没有软件的帮助下,我们直接用notepad打开的话,那样密密麻麻的代码,我想你一定会很头痛的吧;但当如果你用notepad打开的时候,关键字是大写的,自己定义的变量首字母大写其余小写(我们程序员叫这种命名规范为大驼峰式),数据部分又是另一个风格,那应该是另一种感觉吧。

  还有需要注意的一点是:

INSERT INTO DOGroupByFirstTable(Student,Teacher) VALUES('小林','小黄');

等这些语句,其实是可以简写的,但是我这里故意没有简写,因为良好的书写风格,可以提高移植性,当你把你的代码移植到Oracle中后,发现这个报错,那个报错,你就不会为现在多花点时间注意风格而后悔了。

当然这里还是有一点不足的SELECT *这里我用的是*来代替,但是sql server在翻译的时候,会把*转变成我们需要查找的数据(Uid,Student,Teacher)这是需要花时间的,从性能方面考虑还是尽量不要用SELECT *了,我上面的sql脚本就不改了。

 

上面只不过是个人的一点意见。当然自己对sql server 也并不是高手的那种,也是有多多少少的不足,希望高手看到哪里不足之处多多指点。希望在你们的指点中我们一起成长。

 

如果这篇文章对你有帮助,请不要浪费你的推荐,分享是另一种快乐。

posted @ 2012-03-13 10:55  唯吴独尊  阅读(6651)  评论(6编辑  收藏  举报