我如何使用ROW_NUMBER()?

时间:2009-06-07 01:51:18

标签: sql sql-server row-number

我想使用ROW_NUMBER()来获取......

  1. 获取max(ROW_NUMBER()) - >或者我想这也是所有行的计数
  2. 我尝试过:

    SELECT max(ROW_NUMBER() OVER(ORDER BY UserId)) FROM Users
    

    但它似乎没有用......

    1. 使用给定的信息获取ROW_NUMBER(),即。如果我有一个名字,我想知道名字来自哪一行。
    2. 我认为它与我为#1

      所尝试的类似
      SELECT ROW_NUMBER() OVER(ORDER BY UserId) From Users WHERE UserName='Joe'
      

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

      任何想法?

13 个答案:

答案 0 :(得分:133)

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

SELECT COUNT(*) FROM myTable 

得到计数。

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


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

SELECT ROW_NUMBER() OVER (Order by Id) AS RowNumber, Field1, Field2, Field3
FROM User

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

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

答案 1 :(得分:40)

虽然我同意其他人的意见,您可以使用count()来获取总行数,但以下是row_count()的使用方法:

  1. 要获得总行数:

    with temp as (
        select row_number() over (order by id) as rownum
        from table_name 
    )
    select max(rownum) from temp
  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'
  3. 您可以进一步使用min(rownum)max(rownum)分别获取Matt的第一行或最后一行。

    这些是row_number()的非常简单的实现。您可以将它用于更复杂的分组。查看我在Advanced grouping without using a sub query

    上的回复

答案 2 :(得分:24)

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

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

SELECT rows FROM sysindexes WHERE id = OBJECT_ID('table_name') AND indid < 2

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

答案 3 :(得分:7)

ROW_NUMBER()为从1开始的每一行返回一个唯一编号。只需编写代码即可轻松使用:

ROW_NUMBER() OVER (ORDER BY 'Column_Name' DESC) as ROW_NUMBER

您可以找到Row_number()Rank()Dense_Rank() here之间的区别。

答案 4 :(得分:4)

SELECT num, UserName FROM 
 (SELECT UserName, ROW_NUMBER() OVER(ORDER BY UserId) AS num
  From Users) AS numbered
WHERE UserName='Joe'

答案 5 :(得分:3)

可能与此处的问题无关。但我发现使用ROW_NUMBER -

时它可能很有用
SELECT *,
ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS Any_ID 
FROM #Any_Table

答案 6 :(得分:3)

您可以使用它来获取具有has子句的第一条记录

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

答案 7 :(得分:3)

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

答案 8 :(得分:2)

如果您绝对想要使用ROW_NUMBER(而不是count(*)),您可以随时使用:

SELECT TOP 1 ROW_NUMBER() OVER (ORDER BY Id)   
FROM USERS  
ORDER BY ROW_NUMBER() OVER (ORDER BY Id) DESC

答案 9 :(得分:2)

您可以使用Row_Number来限制查询结果。

示例:

SELECT * FROM (
    select row_number() OVER (order by createtime desc) AS ROWINDEX,* 
    from TABLENAME ) TB
WHERE TB.ROWINDEX between 0 and 10

- 通过上述查询,我​​将获得TABLENAME的结果的第1页。

答案 10 :(得分:2)

需要使用WITH table AS创建虚拟表,这在给定的查询中已提到。

通过使用该虚拟表,您可以执行row_number的CRUD操作。

查询:

WITH table AS
-
(SELECT row_number() OVER(ORDER BY UserId) rn, * FROM Users)
-
SELECT * FROM table WHERE UserName='Joe'
-

尽管有INSERT,您也可以在最后一句话中使用UPDATEDELETESELECT

答案 11 :(得分:0)

此查询:

SELECT ROW_NUMBER() OVER(ORDER BY UserId) From Users WHERE UserName='Joe'

将返回UserName'Joe'的所有行,除非您没有UserName='Joe'

它们将按UserID的顺序列出,row_number字段将以1开头并递增,但是许多行包含UserName='Joe'

如果它对您不起作用,则您的WHERE命令有问题,或者表中没有UserID。检查字段UserIDUserName的拼写。

答案 12 :(得分:0)

SQL Row_Number() function用于对相关记录集中的数据行进行排序并分配一个订单号。因此,它用于对行进行编号,例如,确定具有最高订单金额的前10行,或确定每个客户的订单金额最高的行,等等。

如果您想对数据集进行排序,并通过将它们划分为类别来对每一行进行编号,我们可以将Row_Number()与Partition By子句一起使用。例如,对数据集中包含所有订单的每个客户的订单进行排序等。

SELECT
    SalesOrderNumber,
    CustomerId,
    SubTotal,
    ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY SubTotal DESC) rn
FROM Sales.SalesOrderHeader

但是据我了解,您想计算按列分组的行数。为了直观显示需求,如果您想将相关客户的所有订单计数作为除订单信息之外的单独列查看,则可以使用COUNT() aggregation function with Partition By clause

例如,

SELECT
    SalesOrderNumber,
    CustomerId,
    COUNT(*) OVER (PARTITION BY CustomerId) CustomerOrderCount
FROM Sales.SalesOrderHeader