복붙노트

[SQL] 오라클에서 각 그룹에 대한 최신 행을 선택

SQL

오라클에서 각 그룹에 대한 최신 행을 선택

나는 방명록에 사용자 의견이있는 테이블이있다. 열은 다음과 같습니다 : 아이디, USER_ID, 제목, 주석, 타임 스탬프.

나는 각 사용자의 최신 행을 선택해야합니다. 나는에 의해 그룹과이 일을 시도했지만 내가 같은 쿼리에서 아무 것도 선택하지 못할 때문에 havent 한 그것을 관리하는 곳 USER_ID에 의해 전 그룹 :

SELECT user_id, MAX(ts) FROM comments GROUP BY user_id

이 쿼리의 예를 들어 나는 또한 열 경우, 제목과 설명을 선택에 추가 기운 다. 이것은 어떻게 할 수 있는가?

해결법

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

    1.당신은 분석 기능을 사용할 수 있습니다

    당신은 분석 기능을 사용할 수 있습니다

    SELECT *
      FROM (SELECT c.*,
                   rank() over (partition by user_id order by ts desc) rnk
              FROM comments c)
     WHERE rnk = 1
    

    (같은 USER_ID와 TS 두 행이 될 수 있다면) 당신이 관계를 처리하는 방법에 따라 순위가 아닌 ROW_NUMBER 또는 DENSE_RANK 기능을 사용할 수 있습니다. 순위는 동점이 있다면 여러 행이 먼저 할 수있다. 동점이 있다면 ROW_NUMBER 임의로 하나 개의 행을 반환합니다. DENSE_RANK 먼저 공동 그러나 두 번째보다는 세 번째 두 행은 첫째을 위해 넥타이를 가정 할 다음 행을 고려 것이라는 행의 순위처럼 행동한다.

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

    2.당신은이 가입 사용하여 쿼리에 구축 할 수 있습니다 :

    당신은이 가입 사용하여 쿼리에 구축 할 수 있습니다 :

    select c.*
    from comments c join
         (select user_id, max(ts) as maxts
          from comments c2
          group by user_id
         ) cc
         on c.user_id = cc.user_id and c.ts = cc.maxts;
    

    다른 방법이 있습니다. 일반적인 조언) (사용 ROW_NUMBER이다 :

    select t.*
    from (select c.*, row_number() over (partition by user_id order by ts desc) as seqnum
          from comments c
         ) c
    where seqnum = 1;
    

    이 두 쿼리는 미묘하게 다르다. 사용자에 대한 가장 최근의 코멘트가 정확히 같은 TS가 있다면 첫 번째는 중복을 반환합니다. 두 번째는 사용자 당 하나 개의 행을 반환합니다.

  3. ==============================

    3.문제의이 유형은 먼저 밀도 순위 / 마지막 기능을 가진 매우 간단하고 매우 효율적인 솔루션을 제공합니다 :

    문제의이 유형은 먼저 밀도 순위 / 마지막 기능을 가진 매우 간단하고 매우 효율적인 솔루션을 제공합니다 :

    select id,
           max(user_id) keep (dense_rank last order by ts) over (partition by id) as user_id,
           max(title)   keep (dense_rank last order by ts) over (partition by id) as title,
           max(comment) keep (dense_rank last order by ts) over (partition by id) as comment,
           max(ts)                                                                as ts
    from   comments;
    
  4. from https://stackoverflow.com/questions/40404497/select-latest-row-for-each-group-from-oracle by cc-by-sa and MIT license