201

我想用ROW_NUMBER()得到...

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

我试着做:

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

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

  1. 使用给ROW_NUMBER()定的信息,即。如果我有一个名字,我想知道这个名字来自哪一行。

我认为这与我为 #1 尝试的类似

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

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

有任何想法吗?

4

13 回答 13

168

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

SELECT COUNT(*) FROM myTable 

得到计数。

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


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

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

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

SELECT us.Id
FROM (SELECT ROW_NUMBER() OVER (ORDER BY id) AS Row, Id
     FROM User ) us 
WHERE Row = CurrentRow - 5   
于 2009-06-07T01:55:20.827 回答
51

尽管我同意其他人可以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'

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

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

于 2009-06-09T09:52:46.690 回答
26

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

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

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

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

于 2009-06-07T07:06:41.297 回答
13

您可以使用它来获取第一个记录 where has 子句

SELECT TOP(1) * , ROW_NUMBER() OVER(ORDER BY UserId) AS rownum 
FROM     Users 
WHERE    UserName = 'Joe'
ORDER BY rownum ASC
于 2018-10-16T06:02:08.653 回答
12

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

ROW_NUMBER() OVER (ORDER BY 'Column_Name' DESC) as ROW_NUMBER
于 2017-04-21T03:25:14.750 回答
7

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

SELECT *,
ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS Any_ID 
FROM #Any_Table
于 2017-10-19T13:39:07.793 回答
4
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
于 2018-12-14T17:45:29.843 回答
3
SELECT num, UserName FROM 
 (SELECT UserName, ROW_NUMBER() OVER(ORDER BY UserId) AS num
  From Users) AS numbered
WHERE UserName='Joe'
于 2009-06-07T02:02:56.397 回答
2

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

通过使用这个虚拟表,您可以执行 CRUD 操作 wrt row_number

询问:

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

您可以在最后一句中使用INSERT,UPDATEDELETE尽管SELECT

于 2018-10-31T13:01:33.620 回答
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

-- 使用上面的查询,我会得到 PAGE 1 的结果TABLENAME

于 2017-01-06T15:52:30.283 回答
2

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

SELECT TOP 1 ROW_NUMBER() OVER (ORDER BY Id)   
FROM USERS  
ORDER BY ROW_NUMBER() OVER (ORDER BY Id) DESC
于 2016-04-28T02:47:38.900 回答
1

SQL Row_Number() 函数是对相关记录集中的数据行进行排序和分配订单号。所以它用于对行进行编号,例如识别订单金额最高的前10行或识别每个客户的订单金额最高等。

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

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

但据我了解,您想计算按列分组的行数。为了可视化需求,如果您想将相关客户的所有订单计数作为除订单信息之外的单独列查看,您可以使用带有 Partition By 子句的 COUNT() 聚合函数

例如,

SELECT
    SalesOrderNumber,
    CustomerId,
    COUNT(*) OVER (PARTITION BY CustomerId) CustomerOrderCount
FROM Sales.SalesOrderHeader
于 2018-10-16T06:32:44.383 回答
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.

于 2018-10-12T20:46:39.553 回答