결과

2013-01-10 5 views
1

에서 두 번째 행에 액세스 내가 쿼리 아래에 쓴결과

SELECT DEPT_ID, COUNT(*) AS stud_count FROM TBL_STUDENT_DEPARTMENT_593932  
     GROUP BY DEPT_ID ORDER BY stud_count DESC 

그것은 출력 :

DEPT_ID  STUD_COUNT 
-------  ---------- 
Dep02    5 
Dep03    4 
Dep01    3 

것은 내가 두 번째로 큰 stud_count를 선택하려면, 다음과 같이 4 즉, 그래서 ROWNUM을 사용

SELECT stud_count FROM 
(
    SELECT DEPT_ID, COUNT(*) AS stud_count FROM TBL_STUDENT_DEPARTMENT_593932  
     GROUP BY DEPT_ID ORDER BY stud_count DESC 
) 
WHERE ROWNUM = 2; 

그러나 모든 행을 반환하고 빈 테이블 만 반환합니다. 어떻게해야합니까?

+0

사용'LIMIT n을 1 '이 –

+1

@Grijesh이 - LIMIT 오라클에 존재하지 않습니다. –

+0

ROWNUM = N은 N> 1에 대해 아무 것도 반환하지 않습니다. 설명을 보려면 https://forums.oracle.com/forums/thread.jspa?messageID=10267263 –

답변

2

가 확인하시기 바랍니다 :

SELECT * FROM 
(
    SELECT DEPT_ID, COUNT(*) AS stud_count, ROW_NUMBER() over (order by COUNT(*) desc) ROW_NUM 
    FROM TBL_STUDENT_DEPARTMENT_593932  
     GROUP BY DEPT_ID 
) 
WHERE ROW_NUM = 2; 
4

ROWNUM은 특별한 방식으로 동작하므로 중첩 된 쿼리를 사용해야합니다. 먼저 그룹화하여 모든 데이터를 합산하십시오. 외부 쿼리에서 행 번호를 지정합니다. 가장 바깥 쪽 쿼리에서는 두 번째 행만 선택합니다. 당신이 분석 기능을 잘 알고있는 경우

SELECT * 
FROM 
    (
    SELECT dept_id 
    ,  stud_count 
    ,  rownum as stud_num 
    FROM 
     (
     SELECT DEPT_ID 
     ,  COUNT(*) AS stud_count 
     FROM TBL_STUDENT_DEPARTMENT_593932  
     GROUP BY DEPT_ID 
     ORDER BY stud_count DESC 
    ) 
    ) 
WHERE stud_num = 2; 

대신이 문을 사용할 수 있습니다 :

SELECT * 
FROM 
    (
    SELECT DEPT_ID 
    ,  COUNT(*) AS stud_count 
    ,  ROW_NUMBER() over (order by COUNT(*) desc) stud_num 
    FROM TBL_STUDENT_DEPARTMENT_593932  
    GROUP BY DEPT_ID 
) 
WHERE stud_num = 2; 
1

당신이 둥지에 다른 수준이

select dept_id, stud_count 
    from (select rownum r, dept_id, stud_count 
      from (select dept_id, count(*) as stud_count 
        from TBL_STUDENT_DEPARTMENT_593932 
       GROUP BY DEPT_ID 
       order by stud_count desc) 
     where rownum <= 2 
     ) 
where r = 2; 

하지만 rownum mea를 사용합니다. 두 개 이상의 레코드에 두 번째 카운트가 있으면 하나의 행만 가져옵니다. dense_rank()를 사용하면 두 번째로 많은 수의 모든 행이 필요합니다.

select dept_id, stud_count 
    from (select dept_id, count(*) as stud_count, 
        dense_rank() over (order by count(*) desc) rnk 
      from TBL_STUDENT_DEPARTMENT_593932 
      GROUP BY DEPT_ID 
      order by stud_count desc) 
    where rnk = 2; 

예 :

SQL> select dept_id, count(*) stud_count from tbl_student_department_593932 group by dept_id; 

DEPT_ STUD_COUNT 
----- ---------- 
Dep03   4 <-- 
Dep01   3 
Dep05   4 <-- 
Dep02   6 

SQL> select dept_id, stud_count 
    2 from (select rownum r, dept_id, stud_count 
    3    from (select dept_id, count(*) as stud_count 
    4      from tbl_student_department_593932 
    5      group by dept_id 
    6      order by stud_count desc) 
    7   where rownum <= 2) 
    8 where r = 2; 

DEPT_ STUD_COUNT 
----- ---------- 
Dep03   4 

대;

SQL> select dept_id, stud_count 
    2 from (select dept_id, count(*) as stud_count, 
    3     dense_rank() over(order by count(*) desc) rnk 
    4    from tbl_student_department_593932 
    5   group by dept_id 
    6   order by stud_count desc) 
    7 where rnk = 2; 

DEPT_ STUD_COUNT 
----- ---------- 
Dep03   4 
Dep05   4 
0
SELECT TOP DEPT_ID, COUNT(*) AS stud_count 
FROM TBL_STUDENT_DEPARTMENT_593932 tb1 
INNER JOIN tbl_student_department_593932 tb2 
ON tb1.dept_id = tb2.dept_id 
where tb1.count < tb2.count 
+0

올 바르지 않은 신탁 구문 –

+0

이것은 sql에서 태그되었습니다. – brykneval