如何在sql server中不使用rownum()生成行号

时间:2013-09-17 13:40:12

标签: sql-server

我有下表:

CREATE table prd
(
prdid varchar(10)
)
insert into prd values ('prd1011'),('prd1023'),('prd4532'),('prd2341')

我需要使用rownumber返回相同的内容而不使用内置函数的ROWNUM()。 这可能吗?

4 个答案:

答案 0 :(得分:3)

select *, (
    select count(*)
    from prd p2
    where p1.prdid >= p2.prdid
) as cnt
from prd p1

答案 1 :(得分:3)

您未能为请求指定SQL Server版本或动机。

SQL Server 2012+方法

SELECT prdid,
       COUNT(*) OVER (ORDER BY prdid ROWS UNBOUNDED PRECEDING)
FROM prd

SQL Fiddle

答案 2 :(得分:2)

非唯一列的解决方案:

SELECT p.prdid, p.num - t.n + 1 as num
FROM (
    SELECT p1.prdid, p1.cnt
        , (
            SELECT COUNT(*)
            FROM prd p2
            WHERE p2.prdid <= p1.prdid
        ) num
    FROM (
        SELECT p1.prdid, COUNT(*) cnt
        FROM prd p1
        GROUP BY p1.prdid
    ) p1
) p
INNER JOIN (
    select 1 n 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
) t ON t.n <= p.cnt

找到here

答案 3 :(得分:1)

我试过这个并且它有效,但只有在prdid列是唯一的时才能正常工作:

select prdid,
(select COUNT(*) from prd p where p.prdid >= r.prdid)rnk
from prd r order by rnk