sqlite3 を使用しています。
名前 | 成績
A | 80
B | 65
C | 90
D | 77
E | 46
F | 30
例えば上記のようなテーブルがあったとします。
成績がいい人3人のレコードを昇順で取得したいのですが、どのようにすればいいか困っています。
select * from テーブル order by 成績 desc limit 3;
だと上位3人を抽出できるのですが、いい人の順番
C | 90
A | 80
D | 77
となってしまいますよね。
そうではなく、
D | 77
A | 80
C | 90
という結果が欲しいのです。
よろしくおねがいします。
No.5ベストアンサー
- 回答日時:
「TOP n」は、SQL Serverの独自機能であり、他の主要なRDBMSでは使えません。
また、分析関数も、Oracle、SQL Server 2005などのいくつかのRDBMSでしか実装されていません。
そのため、自前で行に通番を振る必要があります。
<成績上位から行に通番を付ける>
select
(select count(*)+1 from tbl1 where 成績>x.成績) as rownum,*
from tbl1 as x;
上記のクエリで通番を付けられますから、このクエリの結果から上位3位タイまでを得るクエリを作ります。
<期待の結果を得るSQL>
select 名前,成績
from(select
(select count(*)+1 from tbl1 where 成績>x.成績) as rownum,*
from tbl1 as x) as y
where rownum<=3
order by 成績
;
No.10
- 回答日時:
>『) AS 式1, s.成績』 の 『式1』ってなんですか?
#6さんへの質問ですが、ついでなので回答しておきます。
#6さんのSQLを、もう少し簡単に書くと、以下のようなSQLになります。
SELECT 名前,s.成績
FROM tbl1 AS s
WHERE (SELECT Count(*)+1 FROM tbl1 where 成績>s.成績)<=3
ORDER BY s.成績;
「as 式1」のところは、「名前」列を指定すればいいところを、誤記されたのだと思います。
なお、やっていることは、#6さんも私も同じで、テーブルを自己結合し、成績の大きい件数をカウントし、+1することで、行に通番を振っています。
A | 80→80より大きい行数は1件
B | 65→同様に3件
C | 90→同様に0件
D | 77→同様に2件
E | 46→同様に4件
F | 30→同様に5件
それぞれ件数に+1することで、大きい順に1~6の通番を付けることができます。
その通番が3以下のもの(上位3位タイまで)を最終的な検索結果として得ています。
「もしかして名前を入れればいいのかな?」と思って入れたのですがうまくいかなかったので質問しました。
でも入力ミスだったんでしょうね。
今日再度チャレンジすると期待する結果が得られました。
解説までしていただきましてありがとうございます。
よくわかりました。
No.9
- 回答日時:
>最後の 『order by 成績』 の部分は必要なのでしょうか?
ほぼすべてのRDBMSは、「ORDER BY」指定がないと、検索結果の返却順序は保証していません。
「保証していないと言っているが、実はプライマリキー順や格納順になるのでは?」と考える人もいるようですが、例えば格納と削除を繰り返したり、プライマリキーの逆順やランダムな格納をすると、すぐに検索結果の順序が乱れたりします。
ジョイン、group byなどを行う場合、内部的にソートされることもありますが、その結果はRDBMS側としては保証されていませんから、内部処理が変わって順序が不定になっても、誰にも文句を言えません。
No.8
- 回答日時:
#5、#7です。
#7の説明で、一部、紛らわしいところがあったので、訂正します。
#7の(2)は、「予約語と同じ表名や列名、一部の特殊記号を含む表名や列名を使う場合」の説明でした。
詳しく教えていただき、ありがとうございます。
試してみた結果、期待通りの結果が得られました。
私のレベルではとても高度な回答だったため、理解に時間がかかってしまいました。。。
それでもうひとつお伺いしたいのですが、
最後の 『order by 成績』 の部分は必要なのでしょうか?
『where rownum <= 3』 で終わっても同じ結果が得られるのでは?と思ったのですが…。
よろしければ最後の一行を付ける意味教えてください。
No.7
- 回答日時:
MS-ACCESSで実機確認した人は、他のRDBMS利用者から見ると、やや不思議(カッコが異様に多かったり、同じ式を繰り返し書いたり)なSQLを提示してくれることがあります。
これは、以下のような理由からですので、参考までに。
(1)「TOP n」は、SQL Server、MS-ACCESSといったマイクロソフト製品の独自機能。
(2)予約語や一部の特殊記号を使う場合、標準SQLや主要なRDBMSでは、「"」で囲む。
SQL Serverは、これに加え、[ ]を使える。
MS-ACCESSは、[ ]で囲む。
ちなみに、SQLiteでも、「"」に加え、 [ ]を使えるようです。
さらにちなみに、MySQLでは「`」を使う。
(3)MS-ACCESSでは、インラインビュー等で式に付けた別名をORDER BYや検索条件に指定できないようであり、同じ式を繰り返し書かなければならないらしい。
主要なRDBMSでは、内側のクエリで式に付けた別名を、外側のクエリで検索条件に指定できる。また、selectの選択リストで付けた別名を、ORDER BYでも指定できる。
(4)MS-ACCESSで生成されるクエリは、異様に( )が多くなる。また、JOIN等で他のRDBMSでは必要のないところにも、MS-ACCESSでは( )が必要なところがある。
No.6
- 回答日時:
改めて、TOPを使用しない方法
SELECT (SELECT Count(*)+1 FROM テーブル where テーブル.成績>s.成績
) AS 式1, s.成績
FROM テーブル AS s
WHERE ((((SELECT Count(*)+1 FROM テーブル where テーブル.成績>s.成績
))<=3))
ORDER BY s.成績;
回答ありがとうございます。
勉強不足ですみません。お伺いしたいのですが、
『) AS 式1, s.成績』 の 『式1』ってなんですか?
No.3
- 回答日時:
#1です
>TOP を使わない方法ありますでしょうか?
limitを使えばよろしいのでは。
要は
ORDER BY 100-[成績]
のような方法で何とかなりそうだと云うことです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- Excel(エクセル) Excelの並び替え(先頭の文字以外を基準に並び替えたい) 3 2023/07/07 22:21
- 学校 小中高はクラスの名簿が50音順ですよね。 でも大学や専門学校は50音順じゃないですね。 アレは成績順 3 2023/03/02 20:34
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「名前(first name) 1 2023/06/24 13:03
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- MySQL select *, `人口(男)`AND`人口(女)`/'面積' as '人口密度'FROM … 1 2023/07/03 21:05
- 高校受験 中学や高校で、成績上位者の名前を廊下に張り出していましたか? 5 2022/09/25 23:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
下記の問合せを行うクエリを、P...
-
うまくいきません教えてくださ...
-
SQLです。こんな感じですか?あ...
-
Access 出荷管理簿を作りたい...
-
住所のDBテーブル、マスターの...
-
Notion@リレーション値の取得...
-
PLSQLのNumber型の初期化
-
QSL でのフォーム画面作成について
-
今度同じサークルだった女の子...
-
このテーブルで
-
Accessの処理速度を速めるため...
-
会社の飲み会の幹事になり、座...
-
SQL Serverのテーブル作成のエラー
-
まるいテーブル 円い 丸い 漢字...
-
外部キーだけのテーブル(主キ...
-
特定物と不代替物の違い
-
DBの容量について
-
数値をNUMBER型にするかCHAR型...
-
一つ前に戻るには…
-
面接のときテーブルが正面に。...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLです。こんな感じですか?あ...
-
うまくいきません教えてくださ...
-
下記の問合せを行うクエリを、P...
-
下記の問合せを行うクエリを、P...
-
accessで在庫管理
-
サブクエリを使用せずにLEFT JO...
-
現在庫算出方法についてお教え...
-
SQLの作成方法
-
access結合クエリを編集可能に
-
SQL CASE文に制御について
-
相関サブクエリの中で、グルー...
-
update文におけるwhereとjoinの...
-
Access 出荷管理簿を作りたい...
-
グループごとの最高得点者一覧...
-
Accessでデータシートに同じデ...
-
SELECT 文の NULL列は?
-
テーブル名をカラムとして取得...
-
SQL、2つのテーブルで条件一致...
-
update文で改行を入れる
-
一つ前に戻るには…
おすすめ情報