我如何使用ROW_NUMBER()?

我想使用ROW_NUMBER()来获取…

  1. 或者我猜这也将是所有行的计数

我试着这样做:

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'

但这也不管用……

什么好主意吗?

978426 次浏览

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

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
SELECT num, UserName FROM
(SELECT UserName, ROW_NUMBER() OVER(ORDER BY UserId) AS num
From Users) AS numbered
WHERE UserName='Joe'

如果需要返回表的总行数,可以使用SELECT COUNT(*)语句以外的另一种方法。

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

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

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

虽然我同意其他人的观点,你可以使用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. To get the row numbers where name is 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'

You can further use min(rownum) or max(rownum) to get the first or last row for Matt respectively.

These were very simple implementations of row_number(). You can use it for more complex grouping. Check out my response on Advanced grouping without using a sub query

如果你真的想使用ROW_NUMBER(而不是count(*)),你可以使用:

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

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

例子:

SELECT * FROM (
select row_number() OVER (order by createtime desc) AS ROWINDEX,*
from TABLENAME ) TB
WHERE TB.ROWINDEX between 0 and 10
< p >—— 通过上述查询,我将从TABLENAME中获得PAGE 1的结果

ROW_NUMBER()为以1开头的每一行返回一个唯一的数字。你可以简单地这样写:

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

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

SELECT *,
ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS Any_ID
FROM #Any_Table

这个查询:

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的拼写。

你可以使用这个来获取第一个有子句的记录

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

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

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

例如,

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

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

通过使用这个虚拟表,你可以执行CRUD操作w.r.t row_number

查询:

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

你可以在最后一句中使用INSERTUPDATEDELETE,而不考虑SELECT

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