복붙노트

[SQL] 그룹 당 하나 개의 칼럼의 최대 값을 반환 행 [중복]

SQL

그룹 당 하나 개의 칼럼의 최대 값을 반환 행 [중복]

나는 힘든 시간 최대 행을 잡아하고 해당 행에 대한 값을 잡기 위해 적어도 두 번 같은 테이블을 검색하지 않고이 일을 데. 문제의 표는이 받아 들일 수 있도록 매우 큽니다.

여기 내 테이블이 어떻게 보이는지입니다 :

SCORES
ID    ROUND    SCORE
1     1        3
1     2        6
1     3        2
2     1        10
2     2        12
3     1        6

나는 각 ID는 가장 최근의 라운드에서 가지고있는 점수를 반환해야합니다. 즉, 최대 (원형)와 행 있지만 최대 점수.

OUTPUT:
ID   ROUND   SCORE
1    3       2
2    2       12
3    1       6

지금은이 :

SELECT * FROM 
(SELECT id, round,
CASE WHEN (MAX(round) OVER (PARTITION BY id)) = round THEN score ELSE NULL END score
 FROM
 SCORES
 where id in (1,2,3)
) scorevals
WHERE
scorevals.round is not null;

이 작동하지만 (내가 수동으로 난 그냥 처음에 그 행을 잡아되지 할 수 있어야한다 이러한 행의 모든를 필터링해야합니다.) 매우 비효율적이다

올바른 값을 얻기 위해 내가 무엇을 할 수 있습니까?

해결법

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

    1.이것은 부질없이 수도 있습니다 :

    이것은 부질없이 수도 있습니다 :

    SELECT DISTINCT
           id
          ,max(round) OVER (PARTITION BY id) AS round
          ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score
    FROM   SCORES
    WHERE  id IN (1,2,3)
    ORDER  BY id;
    

    당신이 질문을 정확하게 돌려줍니다. 중요한 점은 별개가 윈도우 함수 후에 적용한다는 것입니다.

    SQL 바이올린.

    어쩌면 빠르게 두 번 같은 창을 사용하기 때문에 :

    SELECT DISTINCT
           id
          ,first_value(round) OVER (PARTITION BY id ORDER BY round DESC) AS round
          ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score
    FROM   SCORES
    WHERE  id IN (1,2,3)
    ORDER  BY id;
    

    그렇지 않으면 같은 일을.

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

    2.당신은 분석 기능을 사용하여 올바른 궤도에있어. 그러나 당신은 아마 순위 기능이 뭔가를 원하는

    당신은 분석 기능을 사용하여 올바른 궤도에있어. 그러나 당신은 아마 순위 기능이 뭔가를 원하는

    SELECT *
      FROM (SELECT a.*,
                   rank() over (partition by id order by round desc) rnk
              FROM scores
             WHERE id IN (1,2,3))
     WHERE rnk = 1
    

    관계가 아니라으로 모두 돌아보다 당신이 하나의 RNK을 가지고 임의로이 묶여 행 중 하나를 선택할 것 대신 등수의 ROW_NUMBER 분석 기능을 사용할 수 있습니다 (같은 아이디와 라운드를 행)가있을 경우 순위는 것.

    당신은 MAX 분석 기능을 사용하고자한다면, 당신은 또한 같은 뭔가를 할 수

    SELECT *
      FROM (SELECT a.*,
                   MAX(round) OVER (partition by id) max_round
              FROM scores
             WHERE id IN (1,2,3))
     WHERE round = max_round
    
  3. ==============================

    3.문제의이 종류를 위해, 나는 최대 ... KEEP ... DENSE_RANK 구조를 사용하는 경향이 :

    문제의이 종류를 위해, 나는 최대 ... KEEP ... DENSE_RANK 구조를 사용하는 경향이 :

    select
      id,
      max(round)  round,
      max(score) keep (dense_rank last order by round) score
    from
      tq84_scores
    group by
      id;
    

    SQL 바이올린

  4. from https://stackoverflow.com/questions/10342405/return-row-with-the-max-value-of-one-column-per-group by cc-by-sa and MIT license