我想使用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'
但这也不起作用......
任何想法?
答案 0 :(得分:133)
对于第一个问题,为什么不使用?
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
答案 1 :(得分:40)
虽然我同意其他人的意见,您可以使用count()
来获取总行数,但以下是row_count()
的使用方法:
要获得总行数:
with temp as (
select row_number() over (order by id) as rownum
from table_name
)
select max(rownum) from temp
要获取名称为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)
或max(rownum)
分别获取Matt的第一行或最后一行。
这些是row_number()
的非常简单的实现。您可以将它用于更复杂的分组。查看我在Advanced grouping without using a sub query
答案 2 :(得分:24)
如果您需要返回表格的总行数,可以使用SELECT COUNT(*)
语句的替代方法。
由于SELECT COUNT(*)
进行全表扫描以返回行计数,因此大型表可能需要很长时间。在这种情况下,您可以使用sysindexes
系统表。有一个ROWS
列,其中包含数据库中每个表的总行数。您可以使用以下select语句:
SELECT rows FROM sysindexes WHERE id = OBJECT_ID('table_name') AND indid < 2
这将大大减少查询所需的时间。
答案 3 :(得分:7)
ROW_NUMBER()
为从1开始的每一行返回一个唯一编号。只需编写代码即可轻松使用:
ROW_NUMBER() OVER (ORDER BY 'Column_Name' DESC) as ROW_NUMBER
您可以找到Row_number()
,Rank()
和Dense_Rank()
here之间的区别。
答案 4 :(得分:4)
SELECT num, UserName FROM
(SELECT UserName, ROW_NUMBER() OVER(ORDER BY UserId) AS num
From Users) AS numbered
WHERE UserName='Joe'
答案 5 :(得分:3)
可能与此处的问题无关。但我发现使用ROW_NUMBER
-
SELECT *,
ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS Any_ID
FROM #Any_Table
答案 6 :(得分:3)
您可以使用它来获取具有has子句的第一条记录
SELECT TOP(1) * , ROW_NUMBER() OVER(ORDER BY UserId) AS rownum
FROM Users
WHERE UserName = 'Joe'
ORDER BY rownum ASC
答案 7 :(得分:3)
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
答案 8 :(得分:2)
如果您绝对想要使用ROW_NUMBER(而不是count(*)),您可以随时使用:
SELECT TOP 1 ROW_NUMBER() OVER (ORDER BY Id)
FROM USERS
ORDER BY ROW_NUMBER() OVER (ORDER BY Id) DESC
答案 9 :(得分: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
-
通过上述查询,我将获得TABLENAME
的结果的第1页。
答案 10 :(得分:2)
需要使用WITH table AS
创建虚拟表,这在给定的查询中已提到。
通过使用该虚拟表,您可以执行row_number
的CRUD操作。
查询:
WITH table AS
-
(SELECT row_number() OVER(ORDER BY UserId) rn, * FROM Users)
-
SELECT * FROM table WHERE UserName='Joe'
-
尽管有INSERT
,您也可以在最后一句话中使用UPDATE
,DELETE
或SELECT
。
答案 11 :(得分: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
。检查字段UserID
和UserName
的拼写。
答案 12 :(得分:0)
SQL Row_Number() function用于对相关记录集中的数据行进行排序并分配一个订单号。因此,它用于对行进行编号,例如,确定具有最高订单金额的前10行,或确定每个客户的订单金额最高的行,等等。
如果您想对数据集进行排序,并通过将它们划分为类别来对每一行进行编号,我们可以将Row_Number()与Partition By子句一起使用。例如,对数据集中包含所有订单的每个客户的订单进行排序等。
SELECT
SalesOrderNumber,
CustomerId,
SubTotal,
ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY SubTotal DESC) rn
FROM Sales.SalesOrderHeader
但是据我了解,您想计算按列分组的行数。为了直观显示需求,如果您想将相关客户的所有订单计数作为除订单信息之外的单独列查看,则可以使用COUNT() aggregation function with Partition By clause
例如,
SELECT
SalesOrderNumber,
CustomerId,
COUNT(*) OVER (PARTITION BY CustomerId) CustomerOrderCount
FROM Sales.SalesOrderHeader