sql2000不支持Row_Number() over吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql2000不支持Row_Number() over吗相关的知识,希望对你有一定的参考价值。

select Row_Number() over (order by createDate desc) as rowId, * from test
提示:'Row_Number' 不是可以识别的 函数名。
在sql2000里面用什么可以代替Row_Number() over呢?
代码为
select rowId,id,[user_id],author,zhufu,contents,style,photo,createDate,topNum,leftNum
from
(
select Row_Number() over (order by createDate desc) as rowId, * from bless
where
(id=@id or @id=0) and
(author=@author or @author='') and
(zhufu=@zhufu or @zhufu='')and
(@month=0 or month(createdate)=@month)
)
as A where A.rowId >= @start and A.rowId <= @end
order by createDate ASC
怎么修改可以在sql2000里使用呢?

sql 2000不支持,sql 2005及更高版本可以支持。


sql 2000 可以使用临时表配合 identity函数来实现类似功能


select IDENTITY(int,1,1) as rowId  , *  into #tb  from bless where
(id=@id or @id=0) and
(author=@author or @author=\'\') and
(zhufu=@zhufu or @zhufu=\'\')and
(@month=0 or month(createdate)=@month) 
order by createDate desc 
select rowId,id,[user_id],author,zhufu,contents
,style,photo,createDate,topNum,leftNum
from #tb A 
where A.rowId >= @start and A.rowId <= @end
order by createDate ASC
 
drop #tb

   


 

参考技术A Row_Number是2005的函数
2000要使用类似功能用identity

select Identity(int,0,1) as RowId,* into #temp from Table_1

select * from #temp
参考技术B row_number() 是Sql 2005 提供的新函数

如果你是为了分页 你可以使用top

如果你是为了统计 可以使用 group by本回答被提问者和网友采纳
参考技术C sql2000用子查询

select
(select count(1)+1 from test where createDate>t.createDate) as rowId, *
from test t

SQL Server:row_number 分区不重置计数器

【中文标题】SQL Server:row_number 分区不重置计数器【英文标题】:SQL Server : row_number partition does not reset counter 【发布时间】:2021-06-22 13:26:54 【问题描述】:

在下面的数据中,d1 更改为 d2,然后返回 d1,分区在 d 列上,因此分区正确地从第 2 行的 d1->d2 重置并且 rn = 1。我希望分区也可以重置d2->d1,即记录#3 也应该有 rn = 1。

如何解决这个问题?

SELECT
    t.*, 
    rn = ROW_NUMBER() OVER (PARTITION BY d ORDER BY id)
FROM   
    (VALUES (1, 'd1'), (2, 'd2'), (3, 'd1')) t (id, d)
ORDER BY
    id

【问题讨论】:

正确的;那是值 d12nd 行;第一个是id 的值为1 那么分区的顺序是什么。 d 列发生变化,因此它也必须是第三行的新分区 对数据进行分区...它完全按照它说的做,将数据分组。在这种情况下,d 的每个不同值对应 1 个组,d'd1''d2' 和 3 行只有两个不同的值,因此其中一行的值为 2 ;特定值的第二行。在这种情况下,当id 的值为3 时,这就是值'd1'第2 行。它的工作方式与预期完全一致,并且符合记录。 您可以将整体 row_number() - 1 除以 2 以获得分组的行号 【参考方案1】:

猜测您想在每次d 的值更改时以id 的值排序数据时开始行号,这与行号相同每个 d 的值。如果是这种情况,一种方法如下:

SELECT id,
       d,
       ROW_NUMBER() OVER (ORDER BY id ASC) -
       ROW_NUMBER() OVER (PARTITION BY d ORDER BY id ASC) AS RN
FROM dbo.YourTable;

【讨论】:

这会为第 2 行和第 3 行返回 1,我正在寻找每次值从上一行更改时重置的东西。【参考方案2】:

这可以完成工作,但看起来太笨重了。

select 
t.*, 
lagd=lag(d) over (order by id),
change= (case when d= (lag(d) over (order by id)) then 0 else 1 end)
FROM   (VALUES          (1,'d1' ),
                        (2,'d2' ),
                        (3,'d1' ),
                        (4,'d2' ),
                        (5,'d2' )
                        ) t (id, d)
order by id

【讨论】:

以上是关于sql2000不支持Row_Number() over吗的主要内容,如果未能解决你的问题,请参考以下文章

sq2000中的row_number()

将查询从 SQL Server 转换为 Access 2000

08001 - SQL Server Native Client 11.0 不支持连接到SQL Server 2000或更早的版本。

VS 2015 IDE 不支持 MS SQL 2000 生成 dbml

前 MariaDB 版本中的 Row_Number() 窗口函数

SQL Row_Number() 不排序日期