トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

7-61 入室回数の降順に出力

SQLパズル

入室履歴テーブル
入室者      部屋
--------    ----------
ミレニア    祭壇の部屋
ミレニア    断崖の部屋
ミレニア    投獄の部屋
レイナ      業火の部屋
レイナ      受刑の部屋
アリシア    業火の部屋
アリシア    砂岩の部屋
アリシア    祭壇の部屋
アリシア    断崖の部屋

入室者ごとの入室回数の降順、
部屋の降順に出力する。

出力結果
入室者      部屋
--------    ----------
アリシア    業火の部屋
アリシア    砂岩の部屋
アリシア    祭壇の部屋
アリシア    断崖の部屋
ミレニア    祭壇の部屋
ミレニア    断崖の部屋
ミレニア    投獄の部屋
レイナ      業火の部屋
レイナ      受刑の部屋


データ作成スクリプト

create table 入室履歴(
入室者 varchar2(8),
部屋   char(10));

insert into 入室履歴 values('ミレニア','祭壇の部屋');
insert into 入室履歴 values('ミレニア','断崖の部屋');
insert into 入室履歴 values('ミレニア','投獄の部屋');
insert into 入室履歴 values('レイナ'  ,'業火の部屋');
insert into 入室履歴 values('レイナ'  ,'受刑の部屋');
insert into 入室履歴 values('アリシア','業火の部屋');
insert into 入室履歴 values('アリシア','砂岩の部屋');
insert into 入室履歴 values('アリシア','祭壇の部屋');
insert into 入室履歴 values('アリシア','断崖の部屋');
commit;


SQL

--■■■分析関数を使う方法■■■
select 入室者,部屋
  from 入室履歴
order by count(*) over(partition by 入室者) desc,部屋;

--■■■相関サブクエリを使う方法■■■
select 入室者,部屋
  from 入室履歴 a
order by (select count(*) from 入室履歴 b
           where b.入室者 = a.入室者) desc,部屋;


解説

order by句で、分析関数を使うことができます。