zoukankan      html  css  js  c++  java
  • 利用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 也并不是高手的那种,也是有多多少少的不足,希望高手看到哪里不足之处多多指点。希望在你们的指点中我们一起成长。

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

    Stallman 先生认为最大的快乐是让自己发展的软件让大家来使用了!

  • 相关阅读:
    【译】StackExchange.Redis 中文文档(十)性能分析
    【译】StackExchange.Redis 中文文档(九)服务器相关命令
    【译】StackExchange.Redis 中文文档(八)流
    【译】StackExchange.Redis 中文文档(七)推送/订阅消息顺序
    【译】StackExchange.Redis 中文文档(六)事件
    【译】StackExchange.Redis 中文文档(五)事务
    查看供应商2086报表
    创建内部供应商
    创建客户前台配置
    创建客户后台配置-spro
  • 原文地址:https://www.cnblogs.com/Jimmy009/p/2393409.html
Copyright © 2011-2022 走看看