IT story

Oracle에서 최상위 1을 수행하려면 어떻게해야합니까?

hot-time 2020. 4. 20. 20:32
반응형

Oracle에서 최상위 1을 수행하려면 어떻게해야합니까?


다음은 어떻게합니까?

select top 1 Fname from MyTbl

에서 오라클 11g ?


첫 번째로 선택한 행만 원하는 경우 다음을 수행 할 수 있습니다.

select fname from MyTbl where rownum = 1

분석 함수를 사용하여 최상위 x를 주문하고 취할 수도 있습니다.

select max(fname) over (rank() order by some_factor) from MyTbl

SELECT *
  FROM (SELECT * FROM MyTbl ORDER BY Fname )
 WHERE ROWNUM = 1;

함께 오라클 12C (2013 년 6 월), 당신은 다음과 같이 사용할 수 있습니다.

SELECT * FROM   MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL          
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY

당신은 사용할 수 ROW_NUMBER()ORDER BY하위 쿼리 절과의 교환이 열을 사용 TOP N. 이것은 단계별로 설명 될 수 있습니다.

두 개의 열이 아래 표 참조 NAMEDT_CREATED.

여기에 이미지 설명을 입력하십시오

에 관계없이 처음 두 날짜 만 NAME사용해야하는 경우 아래 쿼리를 사용할 수 있습니다. 논리는 쿼리 안에 작성되었습니다

-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
    -- Generates numbers in a column in sequence in the order of date
    SELECT ROW_NUMBER() OVER (ORDER BY DT_CREATED) AS RNO,
    NAME,DT_CREATED
    FROM DEMOTOP
)TAB
WHERE RNO<3;

결과

여기에 이미지 설명을 입력하십시오

경우에 따라 TOP N각각에 대해 결과 를 선택해야합니다 NAME. 이 경우 하위 쿼리에서 절 PARTITION BY과 함께 사용할 수 있습니다 ORDER BY. 아래 쿼리를 참조하십시오.

-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
  --Generates numbers in a column in sequence in the order of date for each NAME
    SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DT_CREATED) AS RNO,
    NAME,DT_CREATED
    FROM DEMOTOP
)TAB
WHERE RNO<3;

결과

여기에 이미지 설명을 입력하십시오


당신은 같은 것을 할 수 있습니다

    SELECT *
      FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
 WHERE rownum = 1;

RANK 및 / 또는 DENSE_RANK 분석 함수를 사용할 수도 있지만 ROWNUM 이 가장 쉬운 방법 일 것입니다.


select * from (
    select FName from MyTbl
)
where rownum <= 1;

사용하다:

SELECT x.*
  FROM (SELECT fname 
          FROM MyTbl) x
 WHERE ROWNUM = 1

Oracle9i +를 사용하는 경우 ROW_NUMBER ()와 같은 분석 함수사용할있지만 ROWNUM과 같이 성능이 떨어 집니다.


테이블에서 첫 번째 행을 선택하고 테이블에서 한 행을 선택하려면 서로 다른 두 가지 작업이 필요하며 다른 쿼리가 필요합니다. 그렇게하는 방법에는 여러 가지가 있습니다. 그중 4 개는 다음과 같습니다.

먼저

select  max(Fname) from MyTbl;

둘째

select  min(Fname) from MyTbl;

제삼

select  Fname from MyTbl  where rownum = 1;

네번째

select  max(Fname) from MyTbl where rowid=(select  max(rowid) from MyTbl)

나는 같은 문제가 있었고이 솔루션으로 이것을 해결할 수 있습니다.

select a.*, rownum 
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1

첫 번째 값을 갖기 전에 결과를 주문할 수 있습니다.

행운을 빕니다

참고 URL : https://stackoverflow.com/questions/3451534/how-do-i-do-top-1-in-oracle

반응형