【问题标题】:Row_Number simulation in Sql server 2000Sql server 2000 中的 Row_Number 模拟
【发布时间】:2011-09-23 08:05:21
【问题描述】:

我有一个示例输入表

Declare  @input TABLE(Name VARCHAR(8))
INSERT INTO @input(Name)  values('Aryan') 
INSERT INTO @input(Name)  values('Aryan') 
INSERT INTO @input(Name)  values('Joseph') 
INSERT INTO @input(Name)  values('Vicky') 
INSERT INTO @input(Name)  values('Jaesmin') 
INSERT INTO @input(Name)  values('Aryan') 
INSERT INTO @input(Name)  values('Jaesmin') 
INSERT INTO @input(Name)  values('Vicky') 
INSERT INTO @input(Name)  values('Padukon') 
INSERT INTO @input(Name)  values('Aryan') 
INSERT INTO @input(Name)  values('Jaesmin') 
INSERT INTO @input(Name)  values('Vick') 
INSERT INTO @input(Name)  values('Padukon') 
INSERT INTO @input(Name)  values('Joseph') 
INSERT INTO @input(Name)  values('Marya') 
INSERT INTO @input(Name)  values('Vicky')

我还有一个如下的计数表

declare @t table(n int)
insert into @t select 1 union all select 2 union all
select 3 union all select 4 union all select 5 union all
select 6 union all select 7 union all select 8 union all
select 9 union all select 10 union all select 11 union all
select 12 union all select 13 union all select 14 union all
select 15 union all select 16 union all select 17 union all
select 18 union all select 19 union all select 20

如果我这样做的话,在 Sql Server 2005 中

 Select rn, name from (
    select ROW_NUMBER()over (order by Name) as rn , * from @input) x
    where rn % 2 <> 0

我得到的输出为

rn  name
1   Aryan
3   Aryan
5   Jaesmin
7   Jaesmin
9   Joseph
11  Padukon
13  Vick
15  Vicky

但我仅限于 Sql server 2000。我怎样才能获得相同的输出?

我试过了

SELECT name, (SELECT COUNT(*) FROM @input AS i2 WHERE i2.Name <= i1.Name) As rn
FROM @input AS i1

但是输出错误

name    rn
Aryan   4
Aryan   4
Joseph  9
Vicky   16
Jaesmin 7
Aryan   4
Jaesmin 7
Vicky   16
Padukon 12
Aryan   4
Jaesmin 7
Vick    13
Padukon 12
Joseph  9
Marya   10
Vicky   16

【问题讨论】:

  • @marc_s:正如@Maximilian Mayerl 所写 - 这是可能的;)。
  • 计数表的意义何在?
  • 您需要向@Input 添加一列,或者根据@Maximilians 的回答将数据插入到另一个临时表/表变量中,因为SQL Server 中无法订购例如Name = 'Aryan' 的四行
  • @Damien_The_Unbeliever,方式存在!看我的回答。

标签: sql tsql sql-server-2000


【解决方案1】:

将表变量声明为

Declare  @input TABLE(_id int identity(1, 1), Name VARCHAR(8))

然后将您的查询重新定义为

Select _id, name 
from @input
where _id % 2 <> 0

【讨论】:

  • 如果我有一个计数表(不干扰现有的@input 表模式),那么我该怎么做,例如声明@t table(n int) 插入@t select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 union all select 10联合全部选择 11 联合全部选择 12 联合全部选择 13 联合全部选择 14 联合全部选择 15 联合全部选择 16 联合全部选择 17 联合全部选择 18 联合全部选择 19 联合全部选择 20
  • 抱歉,我不太明白你在问什么……你能重新提出这个问题吗?
  • 使用INSERT...SELECT...ORDER BY 填充此临时表的是important,而不是SELECT...INTO...ORDER BY
  • 是的,但是你想用那个计数表做什么?
  • 先生,我无法更改表架构.. 但我可以使用计数表...从今以后我想使用计数表而不是标识列
【解决方案2】:

使用这个查询:

SELECT t1.name, t.n
FROM
(
    SELECT a.name, a.c, (SELECT COUNT(*) FROM @input AS i2 WHERE i2.Name <= a.Name) [rn]
    FROM
    (
        SELECT i.name, count(*) c
        FROM @input i
        GROUP BY i.name
    )a
)t1
JOIN @t t ON t.n <= t1.rn
WHERE t.n > t1.rn - t1.c 

它产生所需的输出:

name     n
-------- -----------
Aryan    1
Aryan    2
Aryan    3
Aryan    4
Jaesmin  5
Jaesmin  6
Jaesmin  7
Joseph   8
Joseph   9
Marya    10
Padukon  11
Padukon  12
Vick     13
Vicky    14
Vicky    15
Vicky    16

【讨论】:

  • 嗨,它就像一个魅力......但你能解释一下代码
猜你喜欢
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
相关资源
最近更新 更多