我如何使用ROW_NUMBER()?
我想使用ROW_NUMBER()
来得到…
- 要获得
max(ROW_NUMBER())
– >或者我猜这也将是所有行的计数
我试过了:
SELECT max(ROW_NUMBER() OVER(ORDER BY UserId)) FROM Users
但似乎没有工作…
- 使用给定的信息来获得
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()
:
-
要得到总的no行数:
with temp as ( select row_number() over (order by id) as rownum from table_name ) select max(rownum) from temp
-
要获得行号,名字是马特:
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