一路sql的题目,求解决。万分感谢
一道sql的题目,求解决。万分感谢
------解决方案--------------------
补充一下,视图的更新是转换为基本表的更新,a和b显然可以,c有求平均值,无法转换为基本表的更新
------解决方案--------------------
CREATE TABLE [dbo].[marks](
[student_id] [int] IDENTITY(1,1) NOT NULL,
[score] [int] NULL
) ON [PRIMARY]
GO
Insert Into [dbo].[marks] Values (3)
Insert Into [dbo].[marks] Values (3)
Insert Into [dbo].[marks] Values (1)
Insert Into [dbo].[marks] Values (4)
Insert Into [dbo].[marks] Values (6)
1--.WITHOUT WITH
select * ,
DENSE_RANK() OVER
( ORDER BY i.[score] DESC) AS Rank
from [dbo].[marks] I
2 -WITH WITH
;WITH CTE1 ([score], ROWID)
AS
-- Define the CTE query.
(
select [score] ,
ROW_NUMBER() OVER (ORDER BY [score] ASC) AS ROWID
from ( select distinct [score] from [dbo].[marks] ) A
)
select [student_id], [marks].[score],DENSE_RANK=ROWID from [marks] left join CTE1
On [marks].[score]=CTE1.[score]
Order By ROWID
------解决方案--------------------
1楼的题很简单,
sql2000可以用临时表的identity列, 或者count计数法。
count计数法,可以参考我的blog里“sql查询题解”及后面的评论(如果mark值有重复的话).
sql05 ,08就更简单了,内置了序号函数
row_number, rank,dense_rank等等.
你的问题,一个dense_rank就解决了。
三者之间具体的区别,你可以查下手册。
------解决方案--------------------
没有with那个没考虑分数重复的问题。
带with那个把ASC改成DESC就可以了。
------解决方案--------------------
补充一下,视图的更新是转换为基本表的更新,a和b显然可以,c有求平均值,无法转换为基本表的更新
------解决方案--------------------
CREATE TABLE [dbo].[marks](
[student_id] [int] IDENTITY(1,1) NOT NULL,
[score] [int] NULL
) ON [PRIMARY]
GO
Insert Into [dbo].[marks] Values (3)
Insert Into [dbo].[marks] Values (3)
Insert Into [dbo].[marks] Values (1)
Insert Into [dbo].[marks] Values (4)
Insert Into [dbo].[marks] Values (6)
1--.WITHOUT WITH
select * ,
DENSE_RANK() OVER
( ORDER BY i.[score] DESC) AS Rank
from [dbo].[marks] I
2 -WITH WITH
;WITH CTE1 ([score], ROWID)
AS
-- Define the CTE query.
(
select [score] ,
ROW_NUMBER() OVER (ORDER BY [score] ASC) AS ROWID
from ( select distinct [score] from [dbo].[marks] ) A
)
select [student_id], [marks].[score],DENSE_RANK=ROWID from [marks] left join CTE1
On [marks].[score]=CTE1.[score]
Order By ROWID
------解决方案--------------------
1楼的题很简单,
sql2000可以用临时表的identity列, 或者count计数法。
count计数法,可以参考我的blog里“sql查询题解”及后面的评论(如果mark值有重复的话).
sql05 ,08就更简单了,内置了序号函数
row_number, rank,dense_rank等等.
你的问题,一个dense_rank就解决了。
三者之间具体的区别,你可以查下手册。
------解决方案--------------------
没有with那个没考虑分数重复的问题。
带with那个把ASC改成DESC就可以了。