当前位置: 首页 > 面试题库 >

SQL Server 2000中的Row_Number模拟

融烨磊
2023-03-14
问题内容

我有一个示例输入表

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 Server2000。如何获得相同的输出?

我尝试过

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

问题答案:

使用此查询:

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


 类似资料:
  • 问题内容: MySQL中有没有复制SQL Server函数的好方法? 例如: 然后,例如,我可以添加一个条件以将限制限制为1,以获得每对最高的一行。 问题答案: 我想要每对(col1,col2)对具有最高col3的行。 这是一个按组的最大值,是最常提出的SQL问题之一(因为它看起来应该很容易,但实际上并非如此)。 我经常为null-self-join充实: “获取表中没有匹配col1,col2的其

  • 问题内容: 我需要使用以下查询创建group by子句: 但我想在左边的一栏返回我:1、2、3、4、5等。在MSSql中我会做 这可能吗? 问题答案:

  • 本文向大家介绍调整SQLServer2000运行中数据库结构,包括了调整SQLServer2000运行中数据库结构的使用技巧和注意事项,需要的朋友参考一下 开发过程中的数据库结构结构,不可避免的会需要反复的修改。最麻烦的情况莫过于开发者数据库结构已经修改,而实际应用中数据库又有大量数据,如何在不影响 数据库中数据情况下,更新数据结构呢?当然,我们可以手工对应用数据库表结构各个添加、更正、删除的字段

  • 问题内容: 我有一张桌子: 我想在我的查询输出中增加一列: 困难的部分是B,如果B彼此相邻,我希望它具有相同的顺序,如果不是,则视为新行。 我知道 他们都不符合我想要的条件。有没有办法查询这个? 问题答案: 您想查看停靠点是否在一行和下一行之间改变。如果是这样,您要增加序列。因此,请使用lag将上一个停靠点移至当前行。 我之所以使用DECODE是因为它处理NULL的方式,并且比CASE更为简洁,但

  • 问题内容: 首先,我想提一下,我已经检查了所有其他问题,没有一个与我的相似,所以我认为这不是重复的。 我有两个表表,到目前为止,“ Article_tbl”具有超过300,000行,而“ ArticleZone_tbl”具有几乎相同的行数。 “ Article_tbl”包含一个身份主键“ ArticleID”。“ ArticleZone_tbl”包含一个主键,该主键由三列组成:“ ArticleI

  • 问题内容: 我有一个看起来像这样的SQL查询: 从本质上讲,正是ORDER BY部件在减慢速度。如果我要删除它,则EXPLAIN成本会下降一个数量级(超过1000倍)。我已经试过了: 但这并不能给出正确的结果。有什么简单的方法可以加快速度吗?还是我需要花更多时间使用EXPLAIN工具? 问题答案: 的效率很低。 有关性能的详细信息,请参见我的博客中的文章: 甲骨文:ROW_NUMBER与ROWNU