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

但这也不管用……

什么好主意吗?


当前回答

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

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 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():

获取行总数no: temp为( 选择row_number() over(按id排序)为rownum 从table_name ) 从temp中选择max(rownum) 获取名称为Matt的行号: temp为( 选择name、row_number() over(按id排序)为rownum 从table_name ) select rownum from temp where name like Matt

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

这些都是row_number()的非常简单的实现。您可以将它用于更复杂的分组。检查我的高级分组不使用子查询的响应

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

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