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

2番目に大きい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;

ただし、行は返されず、テーブルは空になります。これどうやってするの?

4

4 に答える 4

4

ROWNUMは特別な方法で動作するため、ネストされたクエリを使用する必要があります。まず、すべてのデータをグループ化して合計します。外側のクエリでは、行番号を割り当てます。次に、最も外側のクエリで、2番目の行のみを選択します。

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;
于 2013-01-10T10:45:27.057 に答える
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;
于 2013-01-10T10:46:05.077 に答える
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を使用するということは、2つ以上のレコードに2番目のカウントがある場合、1行しか取得できないことを意味します。したがって、2番目に多いカウントのすべての行が必要な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

vs;

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
于 2013-01-10T10:49:39.533 に答える
-1
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
于 2013-01-10T10:50:15.470 に答える