복붙노트

[SQL] 어떻게 두 개의 열에서 최대 값을 가진 레코드를 선택하려면?

SQL

어떻게 두 개의 열에서 최대 값을 가진 레코드를 선택하려면?

이 질문에 대한 이해할 수있는 제목으로 올 힘들었다. 내가 예와 함께 설명하려고합니다.

우선 오라클 DB에서 간단한 테이블 정보를 가지고 :

year      type      message
----      ----      -------
2001      1         cakes are yammy
2003      2         apples are dangerous
2012      2         bananas are suspicious
2005      3         cats are tricky

그리고 난 (예를 들어, 유형 = 1 또는 유형 = 2) 특정 유형의 최신 메시지를 선택해야합니다 :

2001      1         cakes are yammy
2012      2         bananas are suspicious

내가 쿼리를 사용 그래서 (BTW, 그러한 상황에서 올바른 방법인가?)

select * from INFO i 
where year = (select max(year) from INFO i_last where i.type = i_last.type) 
and i.type in (1, 2)

하지만 지금은 내 정보 테이블에 새로운 "분기"열을 추가해야합니다. 그리고 올해 분기 별 최신 기록을 선택합니다.

year      quarter      type      message
----      -------      ----      -------
2001      2            1         cakes are yammy
2012      3            2         onions are cruel
2012      1            2         bananas are suspicious
2005      1            3         cats are tricky

제 1 형 또는 2 최신 기록 될 것입니다 :

2001      2            1         cakes are yammy
2012      3            2         onions are cruel

난 그냥 그것을 할 수있는 쿼리를 상상하고, 당신이 좀 도와 바랍니다 수 없습니다.

해결법

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

    1.분석 기능은 당신의 친구입니다 :

    분석 기능은 당신의 친구입니다 :

    SELECT   MAX( year    ) KEEP ( DENSE_RANK LAST ORDER BY year ASC, quarter ASC, message ASC ) AS year,
             MAX( quarter ) KEEP ( DENSE_RANK LAST ORDER BY year ASC, quarter ASC, message ASC ) AS quarter,
             MAX( message ) KEEP ( DENSE_RANK LAST ORDER BY year ASC, quarter ASC, message ASC ) AS message,
             type
    FROM     info
    GROUP BY type;
    

    SQLFIDDLE

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

    2.이것을 샷 보내기

    이것을 샷 보내기

    SELECT i.year, i.quarter, i.type, i.message
    FROM INFO i
    JOIN INFO iy
        ON i.type = iy.type
    JOIN INFO iq
        ON iq.type = iy.type    
    WHERE i.type IN (1,2)   
    GROUP BY i.year, i.quarter, i.type, i.message   
    HAVING i.year = MAX(iy.year) AND i.quarter = MAX(iq.quarter)
    
  3. from https://stackoverflow.com/questions/19981190/how-to-select-records-with-maximum-values-in-two-columns by cc-by-sa and MIT license