복붙노트

[SQL] ROW_NUMBER와 별개의 SQL 쿼리

SQL

ROW_NUMBER와 별개의 SQL 쿼리

나는 SQL의 독특한 키워드로 싸우고있다. 난 그냥 열에 & I 시도 있도록 독특한 (별개의) 값의 모든 행 번호를 표시하려면 :

SELECT distinct id, ROW_NUMBER() OVER (ORDER BY  id) AS RowNum
                             FROM table
                             where fid = 64

그러나 아래의 코드는 나에게 고유 한 값을 제공 :

SELECT distinct id FROM table where fid = 64

그러나 경우에 ROW_NUMBER 그것을 시도했다. 다음은 작동하지 않습니다.

해결법

  1. ==============================

    1.이 옵션을 사용합니다 :

    이 옵션을 사용합니다 :

    SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS RowNum FROM
        (SELECT DISTINCT id FROM table WHERE fid = 64) Base
    

    다른의 "입력"등의 쿼리의 "출력"을 넣어.

    CTE를 사용 :

    ; WITH Base AS (
        SELECT DISTINCT id FROM table WHERE fid = 64
    )
    
    SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS RowNum FROM Base
    

    두 쿼리는 동등해야한다.

    기술적으로 당신은 할 수

    SELECT DISTINCT id, ROW_NUMBER() OVER (PARTITION BY id ORDER BY id) AS RowNum 
        FROM table
        WHERE fid = 64
    

    당신이 DISTINCT 필드의 수를 증가하는 경우, 당신은 예를 들어 그래서, 파티션 BY의 모든 필드를 넣어야 할

    SELECT DISTINCT id, description,
        ROW_NUMBER() OVER (PARTITION BY id, description ORDER BY id) AS RowNum 
        FROM table
        WHERE fid = 64
    

    나는 심지어 DISTINCT가에 쓸모가있을 것이다, 그래서 일부는 / UNION ALL을 조인 쿼리를 결합하지 않는 한, ID가 아마, 정의에 의해 때문에 고유의 기본 키,해야 당신이 여기에 표준 명명 규칙에 대해려고하고 있다는 것을 이해 바랍니다 .. .

  2. ==============================

    2.이것은 당신이 이미 가까운 꽤 있었다 매우 간단 할 수 있습니다

    이것은 당신이 이미 가까운 꽤 있었다 매우 간단 할 수 있습니다

    SELECT distinct id, DENSE_RANK() OVER (ORDER BY  id) AS RowNum
    FROM table
    WHERE fid = 64
    
  3. ==============================

    3.이 문서 ROW_NUMBER ()와 DENSE_RANK () (랭크 () 함수는 특별히 처리되지 않음) 간의 흥미로운 관계를 다룬다. 당신이 SELECT DISTINCT 문에 발생 ROW_NUMBER ()를 필요로 할 때 그들이 DISTINCT 키워드 제거하기 전에 ROW_NUMBER ()는 고유 한 값을 생성합니다. 예를 들면 이 쿼리

    이 문서 ROW_NUMBER ()와 DENSE_RANK () (랭크 () 함수는 특별히 처리되지 않음) 간의 흥미로운 관계를 다룬다. 당신이 SELECT DISTINCT 문에 발생 ROW_NUMBER ()를 필요로 할 때 그들이 DISTINCT 키워드 제거하기 전에 ROW_NUMBER ()는 고유 한 값을 생성합니다. 예를 들면 이 쿼리

    SELECT DISTINCT
      v, 
      ROW_NUMBER() OVER (ORDER BY v) row_number
    FROM t
    ORDER BY v, row_number
    

    ...이 결과를 (DISTINCT는 효과가 없습니다) 생산 수 있습니다

    +---+------------+
    | V | ROW_NUMBER |
    +---+------------+
    | a |          1 |
    | a |          2 |
    | a |          3 |
    | b |          4 |
    | c |          5 |
    | c |          6 |
    | d |          7 |
    | e |          8 |
    +---+------------+
    

    이 쿼리 반면 :

    SELECT DISTINCT
      v, 
      DENSE_RANK() OVER (ORDER BY v) row_number
    FROM t
    ORDER BY v, row_number
    

    ... 당신은 아마이 경우 원하는 생산 :

    +---+------------+
    | V | ROW_NUMBER |
    +---+------------+
    | a |          1 |
    | b |          2 |
    | c |          3 |
    | d |          4 |
    | e |          5 |
    +---+------------+
    

    DENSE_RANK () 함수의 ORDER BY 절은 제대로 작동하려면 SELECT DISTINCT 절에서 다른 모든 열을 필요합니다.

    PostgreSQL을 /베이스 / SQL 표준 구문 (WINDOW 절)를 사용하여 :

    SELECT
      v,
      ROW_NUMBER() OVER (window) row_number,
      RANK()       OVER (window) rank,
      DENSE_RANK() OVER (window) dense_rank
    FROM t
    WINDOW window AS (ORDER BY v)
    ORDER BY v
    

    ... 당신은 얻을 것이다:

    +---+------------+------+------------+
    | V | ROW_NUMBER | RANK | DENSE_RANK |
    +---+------------+------+------------+
    | a |          1 |    1 |          1 |
    | a |          2 |    1 |          1 |
    | a |          3 |    1 |          1 |
    | b |          4 |    4 |          2 |
    | c |          5 |    5 |          3 |
    | c |          6 |    5 |          3 |
    | d |          7 |    7 |          4 |
    | e |          8 |    8 |          5 |
    +---+------------+------+------------+
    
  4. ==============================

    4.이 필드를 추가하고 또한 당신의 선택의 문제를 마스크 수있는 DISTINCT 원인 문제를 사용. 이 같은 대안으로 사용 GROUP BY :

    이 필드를 추가하고 또한 당신의 선택의 문제를 마스크 수있는 DISTINCT 원인 문제를 사용. 이 같은 대안으로 사용 GROUP BY :

    SELECT id
          ,ROW_NUMBER() OVER (ORDER BY  id) AS RowNum
      FROM table
     where fid = 64
     group by id
    

    그럼 당신은이 같이 당신의 선택에서 다른 흥미로운 정보를 추가 할 수 있습니다 :

    ,count(*) as thecount
    

    또는

    ,max(description) as description
    
  5. ==============================

    5.어떻게 같은 약

    어떻게 같은 약

    ;WITH DistinctVals AS (
            SELECT  distinct id 
            FROM    table 
            where   fid = 64
        )
    SELECT  id,
            ROW_NUMBER() OVER (ORDER BY  id) AS RowNum
    FROM    DistinctVals
    

    당신은 또한 시도 할 수

    SELECT distinct id, DENSE_RANK() OVER (ORDER BY  id) AS RowNum
    FROM @mytable
    where fid = 64
    
  6. ==============================

    6.이 시도:

    이 시도:

    ;WITH CTE AS (
                   SELECT DISTINCT id FROM table WHERE fid = 64
                 )
    SELECT id, ROW_NUMBER() OVER (ORDER BY  id) AS RowNum
      FROM cte
     WHERE fid = 64
    
  7. ==============================

    7.이 시도

    이 시도

    SELECT distinct id
    FROM  (SELECT id, ROW_NUMBER() OVER (ORDER BY  id) AS RowNum
          FROM table
          WHERE fid = 64) t
    

    또는 대신 행 번호의) RANK를 (사용 기록을 DISTINCT 순위를 선택

    SELECT id
    FROM  (SELECT id, ROW_NUMBER() OVER (PARTITION BY  id ORDER BY  id) AS RowNum
          FROM table
          WHERE fid = 64) t
    WHERE t.RowNum=1
    

    이것은 또한 고유 한 ID를 반환

  8. from https://stackoverflow.com/questions/18121130/sql-query-distinct-with-row-number by cc-by-sa and MIT license