ROW_NUMBER ()는 어떻게 사용합니까?


175

를 사용하여 사용하고 싶습니다 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'

그러나 이것은 작동하지 않았습니다 ...

어떤 아이디어?

답변:


151

첫 번째 질문에 왜 그냥 사용하지 않습니까?

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   

내 상황에서 UserId가 주어지고 특정 행 수의 UserId를 가져 오려고합니다. 행이 삭제되면 어떻게됩니까? 이 경우 UserId-offset으로 이동할 수 없습니다. 올바른 레코드를 얻지 못하기 때문입니다.

mytable에서 select count (1)를 사용하여 레코드 수를 선택하는 것이 좋습니다. 이렇게 빠르고 효율적입니다
Sivajith 2016 년

46

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. name이 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)각각 매트의 첫 번째 또는 마지막 행을 얻을.

이것들은 매우 간단한 구현이었습니다 row_number(). 보다 복잡한 그룹화에 사용할 수 있습니다. 하위 쿼리를 사용하지 않고 고급 그룹화에 대한 응답을 확인하십시오.


에서 사용되는 열을 선택하는 방법을 설명해 주 order by X시겠습니까? 다시 말해, 어떻게 X결정 해야 합니까? 감사!
케빈 메러디스

@KevinMeredith : order by X행이 할당 될 순서를 결정하는 데 사용할 순서입니다 ROW_NUMBERS(). 관계형 데이터베이스의 테이블은 이름에도 불구하고 정식 순서가 없으므로 행 "1"또는 "10"또는 "1337"을 호출하려면 먼저 ORDER BY절을 사용하여 정렬해야합니다. OVER (ORDER BY X)절 에 나오는 것 입니다.
Wtrmute

25

테이블의 총 행 수를 리턴해야하는 경우 다른 방법으로 SELECT COUNT(*)명령문 을 사용할 수 있습니다 .

때문에 SELECT COUNT(*)행의 수를 반환하는 전체 테이블을 스캔한다, 그것은 큰 테이블에 대해 매우 시간이 오래 걸릴 수 있습니다. sysindexes이 경우 시스템 테이블을 대신 사용할 수 있습니다 . ROWS데이터베이스의 각 테이블에 대한 총 행 수를 포함 하는 열이 있습니다. 다음 select 문을 사용할 수 있습니다.

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

이렇게하면 쿼리 시간이 크게 줄어 듭니다.


전체 테이블 스캔에 대해서는 맞지만 클러스터링되지 않은 인덱스를 사용할 수 있으므로 반드시 클러스터 된 인덱스 스캔 일 필요는 없습니다.
yoel halb

2
다른 RDMBS가 선택 카운트 최적화 된 것처럼 또한이 만 SQL-Server에 대한 사실입니다
요엘 halb

7

ROW_NUMBER() 1부터 시작하여 각 행에 대해 고유 한 숫자를 반환합니다.

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

당신은 차이를 찾을 수 있습니다 Row_number(), Rank()그리고 Dense_Rank() 여기 .


7

has 절이있는 첫 번째 레코드를 얻기 위해 이것을 사용할 수 있습니다

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

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

모든 행 을 열거하려면 -그렇지 않으면 사용자 이름이 Joe 인 행을 열거하는 것입니다. 목표는 아닙니다 .-).
Alex Martelli

1
@ 매트 : 나에게 pedant를 불러; "파생 테이블"또는 "익명 뷰"를 "하위 선택"이라는 용어보다 선호하는 경향이 있습니다.
mechanical_meat

1
@adam, 나도 pedant이기 때문에 "선택해야 할"것이 더 행복 할까? 키워드가 TABLE없거나 VIEW주위에 있을 때 표 또는보기와 같은 용어를 사용하고 싶지 않습니다 ...하지만 SELECT확실합니다!-)
Alex Martelli 2016

@ 알렉스 : 당신은 유효한 포인트를 제시. "Nested select"는 저에게 아주 효과적입니다 :) 그런데, 나는 당신이 당신의 의견과 답변에 추가 한 일화를 읽는 것을 정말로 즐깁니다.
mechanical_meat

@ 아담, 감사합니다! 때로는 내 대답이 여기와 같이 매우 베어 코드이지만 여분의 분이있을 때 답을 살리는 것을 좋아합니다 .-).
Alex Martelli 2016 년

4

여기서 질문과 관련이 없을 수 있습니다. 그러나 나는 그것을 사용할 때 유용 할 수 있음을 발견했다 ROW_NUMBER-

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

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

2

count (*) 대신 ROW_NUMBER를 사용하려면 항상 다음을 사용할 수 있습니다.

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

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

-위의 쿼리를 사용하면에서 PAGE 1 결과를 얻을 수 있습니다 TABLENAME.


2

WITH table AS주어진 Query에서 언급 된를 사용하여 가상 테이블을 작성해야합니다 .

이 가상 테이블을 사용하여 CRUD 조작 wrt를 수행 할 수 있습니다 row_number.

질문:

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

당신은 사용할 수 있습니다 INSERT, UPDATE또는 DELETE에도 불구하고 지난 문장 SELECT.


0

SQL Row_Number () 함수 는 관련 레코드 세트의 데이터 행에 주문 번호를 정렬하고 지정하는 것입니다. 따라서 예를 들어 주문량이 가장 많은 상위 10 개 행을 식별하거나 가장 많은 금액이있는 각 고객의 주문을 식별하는 등의 행 번호를 지정하는 데 사용됩니다.

데이터 세트를 정렬하고 각 행을 카테고리로 분리하여 번호를 매기려면 Partition By 절과 함께 Row_Number ()를 사용하십시오. 예를 들어, 데이터 세트에 모든 주문이 포함 된 각 고객의 주문 정렬

SELECT
    SalesOrderNumber,
    CustomerId,
    SubTotal,
    ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY SubTotal DESC) rn
FROM Sales.SalesOrderHeader

그러나 이해할 수 있듯이 열별로 그룹화 된 행 수를 계산하려고합니다. 요구 사항을 시각화하기 위해 주문 정보 외에 별도의 열로 관련 고객의 모든 주문 수를 보려면 Partition By 절과 함께 COUNT () 집계 함수를 사용할 수 있습니다

예를 들어

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

0

이 쿼리 :

SELECT ROW_NUMBER() OVER(ORDER BY UserId) From Users WHERE UserName='Joe'

(가) 어디에 모든 행을 반환 UserName하지 않습니다 'Joe'더하지 않는 한UserName='Joe'

그들은 순서대로 나열됩니다 UserIDrow_number필드는 1로 시작하지만 많은 행이 포함 증가합니다UserName='Joe'

작동하지 않으면 WHERE명령에 문제가 있거나 UserID테이블에 없는 것 입니다. 필드 UserID와의 맞춤법을 확인하십시오 UserName.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.