当前位置:Gxlcms > 数据库问题 > T-SQL函数之Rank

T-SQL函数之Rank

时间:2021-07-01 10:21:17 帮助过:4人阅读

DepName系名

Student(stuID, name, depID) 学生编号,姓名,系编号

Score(stuID, category, score) 学生编码,科目,成绩

找出每一个系的最高分,并且按系编号,学生编号升序排列,要求顺序输出以下信息:

系编号,系名,学生编号,姓名,总分


测试数据:

  1. USE [test]
  2. GO
  3. /****** Object: Table [dbo].[Score] Script Date: 05/11/2015 23:16:23 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. SET ANSI_PADDING ON
  9. GO
  10. CREATE TABLE [dbo].[Score](
  11. [stuID] [int] NOT NULL,
  12. [category] [varchar](50) NOT NULL,
  13. [score] [int] NOT NULL
  14. ) ON [PRIMARY]
  15. GO
  16. SET ANSI_PADDING OFF
  17. GO
  18. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (1, N‘英语‘, 80)
  19. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (2, N‘数学‘, 80)
  20. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (1, N‘数学‘, 70)
  21. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (2, N‘英语‘, 89)
  22. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (3, N‘英语‘, 81)
  23. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (3, N‘数学‘, 71)
  24. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (4, N‘数学‘, 91)
  25. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (4, N‘英语‘, 61)
  26. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (5, N‘英语‘, 91)
  27. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (6, N‘英语‘, 89)
  28. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (7, N‘英语‘, 77)
  29. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (8, N‘英语‘, 97)
  30. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (9, N‘英语‘, 57)
  31. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (5, N‘数学‘, 87)
  32. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (6, N‘数学‘, 89)
  33. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (7, N‘数学‘, 80)
  34. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (8, N‘数学‘, 81)
  35. INSERT [dbo].[Score] ([stuID], [category], [score]) VALUES (9, N‘数学‘, 84)
  36. /****** Object: Table [dbo].[Department] Script Date: 05/11/2015 23:16:23 ******/
  37. SET ANSI_NULLS ON
  38. GO
  39. SET QUOTED_IDENTIFIER ON
  40. GO
  41. SET ANSI_PADDING ON
  42. GO
  43. CREATE TABLE [dbo].[Department](
  44. [depID] [int] IDENTITY(1,1) NOT NULL,
  45. [depName] [varchar](50) NOT NULL,
  46. PRIMARY KEY CLUSTERED
  47. (
  48. [depID] ASC
  49. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  50. ) ON [PRIMARY]
  51. GO
  52. SET ANSI_PADDING OFF
  53. GO
  54. SET IDENTITY_INSERT [dbo].[Department] ON
  55. INSERT [dbo].[Department] ([depID], [depName]) VALUES (1, N‘计算机‘)
  56. INSERT [dbo].[Department] ([depID], [depName]) VALUES (2, N‘生物‘)
  57. INSERT [dbo].[Department] ([depID], [depName]) VALUES (3, N‘数学‘)
  58. SET IDENTITY_INSERT [dbo].[Department] OFF
  59. /****** Object: Table [dbo].[Student] Script Date: 05/11/2015 23:16:23 ******/
  60. SET ANSI_NULLS ON
  61. GO
  62. SET QUOTED_IDENTIFIER ON
  63. GO
  64. SET ANSI_PADDING ON
  65. GO
  66. CREATE TABLE [dbo].[Student](
  67. [stuID] [int] IDENTITY(1,1) NOT NULL,
  68. [stuName] [varchar](50) NOT NULL,
  69. [deptID] [int] NOT NULL,
  70. PRIMARY KEY CLUSTERED
  71. (
  72. [stuID] ASC
  73. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  74. ) ON [PRIMARY]
  75. GO
  76. SET ANSI_PADDING OFF
  77. GO
  78. SET IDENTITY_INSERT [dbo].[Student] ON
  79. INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (1, N‘计算机张三‘, 1)
  80. INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (2, N‘计算机李四‘, 1)
  81. INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (3, N‘计算机王五‘, 1)
  82. INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (4, N‘生物amy‘, 2)
  83. INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (5, N‘生物kity‘, 2)
  84. INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (6, N‘生物lucky‘, 2)
  85. INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (7, N‘数学_yiming‘, 3)
  86. INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (8, N‘数学_haoxue‘, 3)
  87. INSERT [dbo].[Student] ([stuID], [stuName], [deptID]) VALUES (9, N‘数学_wuyong‘, 3)
  88. SET IDENTITY_INSERT [dbo].[Student] OFF
  89. /****** Object: Default [DF__Departmen__depNa__5441852A] Script Date: 05/11/2015 23:16:23 ******/
  90. ALTER TABLE [dbo].[Department] ADD DEFAULT (‘‘) FOR [depName]
  91. GO
  92. /****** Object: Default [DF__Score__category__5EBF139D] Script Date: 05/11/2015 23:16:23 ******/
  93. ALTER TABLE [dbo].[Score] ADD DEFAULT (‘‘) FOR [category]
  94. GO
  95. /****** Object: Default [DF__Score__score__5FB337D6] Script Date: 05/11/2015 23:16:23 ******/
  96. ALTER TABLE [dbo].[Score] ADD DEFAULT ((0)) FOR [score]
  97. GO
  98. /****** Object: Default [DF__Student__stuName__59063A47] Script Date: 05/11/2015 23:16:23 ******/
  99. ALTER TABLE [dbo].[Student] ADD DEFAULT (‘‘) FOR [stuName]
  100. GO
  101. /****** Object: ForeignKey [FK__Student__deptID__59FA5E80] Script Date: 05/11/2015 23:16:23 ******/
  102. ALTER TABLE [dbo].[Student] WITH CHECK ADD FOREIGN KEY([deptID])
  103. REFERENCES [dbo].[Department] ([depID])
  104. GO

SQL查询语句:

  1. with t1
  2. as
  3. (
  4. select b.stuID,SUM(a.score) as score from dbo.Score a
  5. left join dbo.Student b on a.stuID = b.stuID
  6. group by b.stuID
  7. ),
  8. t2
  9. as
  10. (
  11. select a.stuID,a.stuName,a.deptID,b.depName from dbo.Student a
  12. left join Department b on a.deptID = b.depID
  13. ),
  14. t3
  15. as
  16. (
  17. select rank() OVER(partition by deptID order by score desc) as RowId,
  18. t2.stuID,t2.stuName,t2.deptID,t2.depName,t1.score from t1
  19. left join t2 on t1.stuID = t2.stuID
  20. )
  21. select stuID,stuName,deptID,depName,score from t3 where RowId = 1


查询结果:

技术分享

与row_rumber不同,rank考虑到了over子句中排序字段值相同的情况。如果使用row_number替换rank,则deptID为2的记录只会有1条。

T-SQL函数之Rank

标签:

人气教程排行