programing

Oracle SQL에서 날짜별로 정렬된 상위 1개를 선택하는 방법은 무엇입니까?

iphone6s 2023. 7. 21. 21:25
반응형

Oracle SQL에서 날짜별로 정렬된 상위 1개를 선택하는 방법은 무엇입니까?

상위 1개를 선택하는 방법에는 명확한 이 있습니다.

select * from table_name where rownum = 1

날짜순으로 내림차순으로 정렬하는 방법:

select * from table_name order by trans_date desc

하지만 그들은 함께 일하지 않습니다 (rownum에 따라 생성되지 않습니다.trans_date):

... where rownum = 1 order by trans_date desc

문제는 날짜별로 주문한 상위 1개를 어떻게 선택하느냐는 것입니다.

... where rownum = 1 order by trans_date desc

이렇게 하면 임의로 선택한 레코드가 하나 선택됩니다.where rownum = 1) 그런 다음 이 레코드 하나를 정렬합니다(order by trans_date desc).

Ivan이 보여준 것처럼 하위 쿼리를 사용하여 레코드를 주문한 다음 첫 번째 레코드를 보관할 수 있습니다.where rownum = 1외부 질문에그러나 이는 Oracle에 매우 특정하며 하위 쿼리 결과가 순서가 지정되지 않은 것으로 간주되는 SQL 표준을 위반합니다(즉, 절별 순서는 DBMS에서 무시할 수 있음).

따라서 표준 솔루션을 사용하는 것이 좋습니다.오라클 12c 기준:

select * 
from table_name 
order by trans_date desc
fetch first 1 row only;

이전 버전의 경우:

select *
from
(
  select t.*, row_number() over (order by trans_date desc) as rn
  from table_name t
)
where rn = 1;

최신 Oracle 버전은 다음과 같습니다.FETCH FIRST:

select * from table_name order by trans_date desc
fetch first 1 row only

하위 쿼리가 있어야 조합이rownum & order작동 가능:

select * from (select * from table_name order by trans_date desc) AS tb where rownum = 1

이에 대해 창 기능을 사용할 수 있습니다.

select t.*
from (
  select *, 
         min(trans_date) over () as min_date,
         max(trans_date) over () as max_date
  from the_table 
) t 
where trans_date = min_date 
   or trans_date = max_date;

또 다른 옵션은 파생된 테이블에 가입하는 것입니다.

select t1.*
from the_table 
  join ( 
    select min(trans_date) over () as min_date,
           max(trans_date) over () as max_date
    from the_table
) t2 on t1.trans_date = t2.min_date 
     or t1.trans_date = t2.max_date;

어떤 것이 더 빠를지 확실하지 않습니다. 실행 계획을 확인해야 합니다.

언급URL : https://stackoverflow.com/questions/44430702/how-to-select-top-1-and-ordered-by-date-in-oracle-sql

반응형