我如何使用ROW_NUMBER()?

166 sql sql-server row-number

我想用它ROW_NUMBER()来...

  1. 得到max(ROW_NUMBER())- >或者我猜这也是所有行的计数

我试过做:

SELECT max(ROW_NUMBER() OVER(ORDER BY UserId)) FROM Users
Run Code Online (Sandbox Code Playgroud)

但它似乎没有工作......

  1. 要获得ROW_NUMBER()使用给定的资料片,即得.如果我有一个名字,我想知道名字来自哪一行.

我认为这将类似于我为#1尝试的东西

SELECT ROW_NUMBER() OVER(ORDER BY UserId) From Users WHERE UserName='Joe'
Run Code Online (Sandbox Code Playgroud)

但这也不起作用......

有任何想法吗?

Dar*_*ler 141

对于第一个问题,为什么不使用?

SELECT COUNT(*) FROM myTable 
Run Code Online (Sandbox Code Playgroud)

得到数.

对于第二个问题,该行的主键是应该用于标识特定行的内容.不要尝试使用行号.


如果您在主查询中返回Row_Number(),

SELECT ROW_NUMBER() OVER (Order by Id) AS RowNumber, Field1, Field2, Field3
FROM User
Run Code Online (Sandbox Code Playgroud)

然后,当您想要返回5行时,您可以获取当前行号并使用以下查询来确定具有currentrow -5的行

SELECT us.Id
FROM (SELECT ROW_NUMBER() OVER (ORDER BY id) AS Row, Id
     FROM User ) us 
WHERE Row = CurrentRow - 5   
Run Code Online (Sandbox Code Playgroud)


Ras*_*dit 42

虽然我同意其他人可以count()用来获取总行数,但以下是如何使用row_count():

  1. 要获得总行数:

    with temp as (
        select row_number() over (order by id) as rownum
        from table_name 
    )
    select max(rownum) from temp
    Run Code Online (Sandbox Code Playgroud)
  2. 要获取名称为Matt的行号:

    with temp as (
        select name, row_number() over (order by id) as rownum
        from table_name
    )
    select rownum from temp where name like 'Matt'
    Run Code Online (Sandbox Code Playgroud)

您可以进一步使用min(rownum)max(rownum)分别获取Matt的第一行或最后一行.

这些是非常简单的实现row_number().您可以将它用于更复杂的分组.在不使用子查询的情况下查看我对高级分组的响应


Muh*_*tar 24

如果需要返回表的总行数,可以使用该SELECT COUNT(*)语句的替代方法.

因为SELECT COUNT(*)进行全表扫描以返回行计数,所以对于大表可能需要很长时间.sysindexes在这种情况下,您可以使用系统表.有一ROWS列包含数据库中每个表的总行数.您可以使用以下select语句:

SELECT rows FROM sysindexes WHERE id = OBJECT_ID('table_name') AND indid < 2
Run Code Online (Sandbox Code Playgroud)

这将大大减少查询所需的时间.

  • 这也适用于Sql-Server,因为其他RDMBS已经优化了选择计数 (2认同)

小智 7

ROW_NUMBER() 返回以1开头的每一行的唯一编号.您只需编写以下内容即可轻松使用:

ROW_NUMBER() OVER (ORDER BY 'Column_Name' DESC) as ROW_NUMBER
Run Code Online (Sandbox Code Playgroud)

你可以找到之间的差异Row_number(),Rank()Dense_Rank() 在这里.


小智 7

可能与这里的问题无关。但我发现它在使用时很有用ROW_NUMBER-

SELECT *,
ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS Any_ID 
FROM #Any_Table
Run Code Online (Sandbox Code Playgroud)


Omi*_*vid 7

您可以将其用于获取具有has子句的第一条记录

SELECT TOP(1) * , ROW_NUMBER() OVER(ORDER BY UserId) AS rownum 
FROM     Users 
WHERE    UserName = 'Joe'
ORDER BY rownum ASC
Run Code Online (Sandbox Code Playgroud)


小智 6

select 
  Ml.Hid,
  ml.blockid,
  row_number() over (partition by ml.blockid order by Ml.Hid desc) as rownumber,
  H.HNAME 
from MIT_LeadBechmarkHamletwise ML
join [MT.HAMLE] h on ML.Hid=h.HID
Run Code Online (Sandbox Code Playgroud)