我如何使用ROW_NUMBER()?

我想使用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' 

但是这也不pipe用

有任何想法吗?

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

 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 

虽然我同意别人的看法,你可以使用count()来获取行的总数,下面是你如何使用row_count()

  1. 要得到总的no行数:

     with temp as ( select row_number() over (order by id) as rownum from table_name ) select max(rownum) from temp 
  2. 要获得行号,名字是马特:

     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)max(rownum)分别获取Matt的第一行或最后一行。

这些是row_number()非常简单的实现。 您可以将其用于更复杂的分组。 看看我的反应高级分组,而不使用子查询

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

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

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

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

ROW_NUMBER()为从1开始的每一行返回一个唯一的数字。您可以通过简单地写入来简单地使用它:

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

你可以在这里findRow_number()Rank()Dense_Rank()之间的区别。

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

把你的标题字面,这里是一个博客条目解释所谓的窗口函数(其中row_number是其中之一):

http://www.depesz.com/index.php/2009/01/21/waiting-for-84-window-functions/

如果你绝对要使用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 

– 通过上面的查询,我将得到TABLENAME结果的第一页。

可能与这里的问题没有关系。 但是我发现使用行号可能会很有用 –

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