[sql] 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'

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

어떤 아이디어?



답변

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

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. 총 행 수를 얻으려면 :

    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(). 보다 복잡한 그룹화에 사용할 수 있습니다. 하위 쿼리를 사용하지 않고 고급 그룹화에 대한 응답을 확인하십시오.


답변

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

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

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

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


답변

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

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

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


답변

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

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


답변

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


답변

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

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