ここでは虹裏imgのかなり古い過去ログを閲覧することができます。
22/12/09(金)21:47:40 No.1002297555
たすけて 学校で組・名前・教科・点数の列を持つテーブルがあったとき、各教科ごとにB組の中で最も高い点数を取った子のレコードを出したい 自分で書くなら教科ごとの最高点を予め集計して元のテーブルと内部結合、みたいな書き方かなって思うんだけどもっとスマートな方法あるのかな
1 22/12/09(金)21:50:11 No.1002298796
どれが1テーブルなんだ
2 22/12/09(金)21:51:20 No.1002299303
ここはエンジニア歴21年の俺に任せろ
3 22/12/09(金)21:52:14 No.1002299637
学校の課題かな
4 22/12/09(金)21:52:33 No.1002299778
学校の宿題かよ
5 22/12/09(金)21:52:53 No.1002299904
すごく学校の課題臭がする
6 22/12/09(金)21:53:29 No.1002300211
お題が学校なのが学校の課題感をさらに高める
7 22/12/09(金)21:53:44 No.1002300306
>B組の中で最も高い点数 >教科ごとの最高点を予め集計 内部結合した後集計だ
8 22/12/09(金)21:54:58 No.1002300885
GROUPBYとMAXすら習わなかったのか授業起きてたか?
9 22/12/09(金)21:55:00 No.1002300895
ウィンド関数を使え
10 22/12/09(金)21:56:52 No.1002301772
ChatGPTにそのままの文章で投げてみよう
11 22/12/09(金)21:56:56 No.1002301796
複数人いるかもしれないから一回B組の最高点を出してからそれと同じ点数の奴を引っ張ってくるかな
12 22/12/09(金)21:57:23 No.1002302007
知恵袋と同レベルの掲示板…ってこと!?
13 22/12/09(金)21:57:46 No.1002302178
内部結合するより
14 22/12/09(金)21:58:01 No.1002302288
>ChatGPT こいつマジで賢いな… 理解して答えを出しやがった
15 22/12/09(金)21:59:00 No.1002302734
書き込みをした人によって削除されました
16 22/12/09(金)22:00:09 No.1002303225
>知恵袋と同レベルの掲示板…ってこと!? 大喜利の質は知恵袋以下じゃない?
17 22/12/09(金)22:00:11 No.1002303240
>内部結合した後集計だ やっぱりそうなるかありがとう >複数人いるかもしれないから一回B組の最高点を出してからそれと同じ点数の奴を引っ張ってくるかな 同点は頭になかったやありがとう 大体イメージ付いたこれで授業にもついていけるよ 残りはみんなのお悩み相談所にしていいよ
18 22/12/09(金)22:01:00 No.1002303637
最初のテーブルが正規化されてないよね 分離してBC正規形にしよう
19 22/12/09(金)22:01:01 No.1002303646
ガキはもっとまともな掲示板へ行け
20 22/12/09(金)22:02:38 No.1002304381
テーブルの資料画像貼って貰わないとよくわからん…
21 22/12/09(金)22:03:41 No.1002304845
B組には何百万人くらい居るの?
22 22/12/09(金)22:05:58 No.1002305893
実務的会話やめぇ!
23 22/12/09(金)22:06:27 No.1002306083
これって今は高校とかでやるの?俺の学生時代にこんなの習わなかった
24 22/12/09(金)22:06:45 No.1002306212
女子小学生かな?
25 22/12/09(金)22:08:30 No.1002307088
RDBMSはなんなんだよー
26 22/12/09(金)22:09:07 No.1002307365
>これって今は高校とかでやるの?俺の学生時代にこんなの習わなかった 情報学科の学生とかじゃね流石に
27 22/12/09(金)22:09:24 No.1002307512
正直解決するだけなら2秒でできるけど高速化するならどうなるんだこれ
28 22/12/09(金)22:10:38 No.1002308082
内容と取ってくる値のしょうもなさで学校の課題臭いなと思ったら学校の課題だった
29 22/12/09(金)22:13:49 No.1002309550
SQLわかんね
30 22/12/09(金)22:14:05 No.1002309667
速度優先かコードの見た目優先かで結構変わるヤツだ 学校レベルのレコード数なら見た目優先で良さそうだが
31 22/12/09(金)22:14:57 No.1002310078
>女子小学生かな? 手取り足取り教えますよ
32 22/12/09(金)22:15:58 No.1002310537
こういうとき実際のデータ出してもらわないとクエリが書けない
33 22/12/09(金)22:16:17 No.1002310696
>速度優先かコードの見た目優先かで結構変わるヤツだ 上の内部結合ってのはどっちなん
34 22/12/09(金)22:17:47 No.1002311324
MySQLにWINDOW関数なんて高度な関数ありませぇぇぇん!
35 22/12/09(金)22:18:01 No.1002311439
今の少子化の学校くらいの人数なら速度は気にしなくていいかもな
36 22/12/09(金)22:19:02 No.1002311945
>>速度優先かコードの見た目優先かで結構変わるヤツだ >上の内部結合ってのはどっちなん 国産DB じゃなければ仕事で使っても良い
37 22/12/09(金)22:19:52 No.1002312340
>MySQLにWINDOW関数なんて高度な関数ありませぇぇぇん! 再帰クエリ書けるようになったのさえつい最近だからな…
38 22/12/09(金)22:19:54 No.1002312352
なんも考えてないで作ると意外と遅くなるから ちゃんと速度や軽さ考慮しないとダメじゃね?
39 22/12/09(金)22:20:50 No.1002312775
>なんも考えてないで作ると意外と遅くなるから >ちゃんと速度や軽さ考慮しないとダメじゃね? それも金で解決出来るとこはあるからな…
40 22/12/09(金)22:21:38 No.1002313156
MySQLは置いてきた ハッキリ言って付いていけない
41 22/12/09(金)22:21:42 No.1002313198
>MySQLにWINDOW関数なんて高度な関数ありませぇぇぇん! MySQLにもWindow関数はあるよ! 8.0から!!
42 22/12/09(金)22:21:45 No.1002313217
4桁もいかないオーダーなら速度なんてミリ秒でしか変わらん
43 22/12/09(金)22:22:27 No.1002313538
PL/SQLで作れば ええ!
44 22/12/09(金)22:22:27 No.1002313539
一万人規模でも工夫せずに1秒切るだろ
45 22/12/09(金)22:22:45 No.1002313646
>PL/SQLで作れば >ええ! 頼むから死んでくれ
46 22/12/09(金)22:22:50 No.1002313683
そもそもちゃんとデータは登録されるのか?
47 22/12/09(金)22:23:10 No.1002313837
1テーブルに組・名前・教科・点数の列があるなら耐えられない
48 22/12/09(金)22:23:14 No.1002313865
この場合って一度テーブル全部読んでそこから最大値求めてからもう一回全部読んで一致するもの抽出…だけど効率としてはこれでいいのか分かんないからSQL詳しい人に聞きたい
49 22/12/09(金)22:23:22 No.1002313918
しかしこんなとこで課題内容相談しちゃうの凄いな…
50 22/12/09(金)22:23:23 No.1002313922
>MySQLにもWindow関数はあるよ! >8.0から!! マジで知らなかった まぁ俺の現場では5.6がバリバリ現役で動いてるんだけどな!
51 22/12/09(金)22:24:34 No.1002314372
俺は実データと実クエリでEXPLAINの結果を見ないとなんとも言えないマン
52 22/12/09(金)22:24:36 No.1002314388
そこまで大量のデータ扱うこと無いから今んとこどうにかなってるけどビックデータ扱う事になったらどうすりゃいいとか全然わかんないんだよな…
53 22/12/09(金)22:25:11 No.1002314646
SQL全然分からない
54 22/12/09(金)22:25:12 No.1002314648
5.6なら一応セーフ寄りだと思うけど俺の感覚合ってるのかはわからん
55 22/12/09(金)22:25:46 No.1002314893
>そこまで大量のデータ扱うこと無いから今んとこどうにかなってるけどビックデータ扱う事になったらどうすりゃいいとか全然わかんないんだよな… Bigquery使えばTB級のフルスキャンしても10秒ぐらいで結果返ってくるので お金がかかること以外はマジで最強だよ
56 22/12/09(金)22:26:55 No.1002315348
そもそも設計がミスってる気がする
57 22/12/09(金)22:27:21 No.1002315572
>>MySQLにWINDOW関数なんて高度な関数ありませぇぇぇん! >再帰クエリ書けるようになったのさえつい最近だからな… 高度もなにも20年近く前に規格化されたのを今まで放っておいたの?ひどすぎない?
58 22/12/09(金)22:27:52 No.1002315808
>Bigquery使えばTB級のフルスキャンしても10秒ぐらいで結果返ってくるので >お金がかかること以外はマジで最強だよ 1TBのフルスキャンするクエリでも5ドルだから無駄に繰り返さなければマジで安いんだよね まあフラットレート契約するけどね
59 22/12/09(金)22:28:02 No.1002315887
恥ずかしくて聞けないんだけどMYSQLってなんで5.7からいきなり8.0に飛んでるんだ…?
60 22/12/09(金)22:29:38 No.1002316615
MySQLって割りとレガシーなんだ 知らなかった…ぞうさんのほうがイケメンなんだ…
61 22/12/09(金)22:30:26 No.1002316929
>恥ずかしくて聞けないんだけどMYSQLってなんで5.7からいきなり8.0に飛んでるんだ…? MySQL6.0があったけどリリースされなかった MySQL7.0はClusterとバージョン番号がぶつかる という理由で8.0に飛んだらしい
62 22/12/09(金)22:30:34 No.1002316983
>この場合って一度テーブル全部読んでそこから最大値求めてからもう一回全部読んで一致するもの抽出…だけど効率としてはこれでいいのか分かんないからSQL詳しい人に聞きたい テーブル全部読むなら並び変えりゃ一発で仕分けられる値に変換できるでしょうが
63 22/12/09(金)22:31:29 No.1002317440
>恥ずかしくて聞けないんだけどMYSQLってなんで5.7からいきなり8.0に飛んでるんだ…? ちょっと検索したらOracleが買収する前に6系の開発をしていてMySQL Clusterが7系のバージョンを持っていたから8に飛んだという回答を見た
64 22/12/09(金)22:33:18 No.1002318277
windowsだって8.1から10に飛んだしよくあること
65 22/12/09(金)22:33:34 No.1002318380
>>この場合って一度テーブル全部読んでそこから最大値求めてからもう一回全部読んで一致するもの抽出…だけど効率としてはこれでいいのか分かんないからSQL詳しい人に聞きたい >テーブル全部読むなら並び変えりゃ一発で仕分けられる値に変換できるでしょうが そういえばそうか…ソートが何故か重い処理だと変な勘違いしてたよありがとう
66 22/12/09(金)22:33:49 No.1002318483
select name,MAX(point) from table where class='B' and subject='math' group by name , max union select name,MAX(point) from table where class='B' and subject='language' group by name , max みたいな書き方されてるのを見たことがある 教科増えたらどうすんのさ!
67 22/12/09(金)22:34:14 No.1002318658
>No.1002316929 >No.1002317440 ありがたい…結構ガバガバなんだな…
68 22/12/09(金)22:34:27 No.1002318729
MySQLはシンプルなSQLのサブセットを実行するためのシンプルなエンジンなことに価値があったけど本当のSQLってのは複雑なものなんだ
69 22/12/09(金)22:34:45 No.1002318844
>みたいな書き方されてるのを見たことがある >教科増えたらどうすんのさ! 教科増えた時に勝手に増えると困る場合もあるからそれはそれでよくね?
70 22/12/09(金)22:35:01 No.1002318962
>教科増えたらどうすんのさ! そんときゃUNION追加するまでさ!
71 22/12/09(金)22:35:22 [ChatGPT] No.1002319105
そのようなタスクを実現するためには、まず各教科を列挙し、それぞれについてB組の中で最も高い点数を取った子のレコードを抽出する必要があります。そのためには、以下のようなSQLクエリを使用することができます。 SELECT class, name, subject, MAX(score) AS max_score FROM students WHERE class = 'B' GROUP BY subject; 上記のクエリでは、classが'B'であるすべての学生のレコードを抽出し、subjectごとに集計し、各教科ごとに最も高い点数を持つ学生のレコードを返します。 ただし、上記のクエリは実際には動作しない可能性があります。実際の動作については、データベースに接続して実行する必要があります。また、上記のクエリはあくまで例であり、実際のニーズに合わせて適宜修正する必要があります。
72 22/12/09(金)22:35:47 No.1002319281
Oracle以外ほとんど使ったことなくてポスグレとか使ったとき頭抱える
73 22/12/09(金)22:36:46 No.1002319660
>Oracle以外ほとんど使ったことなくてポスグレとか使ったとき頭抱える 空文字はNULLなんだろ!?
74 22/12/09(金)22:36:55 No.1002319726
>Oracle以外ほとんど使ったことなくてポスグレとか使ったとき頭抱える INNER JOIN ONとか書かないよねOracle使ってると SQLServerとかいじる時もちょっと手が止まる
75 22/12/09(金)22:38:09 No.1002320231
>みたいな書き方されてるのを見たことがある 1回だけテーブルスキャンして判定すりゃよさそうなことをunion使って複数回同じテーブルスキャンしてるの見るとイラッっとする
76 22/12/09(金)22:39:30 No.1002320751
UNIONよりサブクエリを多用してる
77 22/12/09(金)22:39:47 No.1002320875
select * from t where class = 'b' and subject = 'math' and score = (select max(score) from t where subject = 'math' and class = 'b') これをunionで教科の数だけつなげようぜ!
78 22/12/09(金)22:39:53 No.1002320921
>>Oracle以外ほとんど使ったことなくてポスグレとか使ったとき頭抱える >空文字はNULLなんだろ!? Oracleだけしかやってない人ってnullの意味わかって無くてダメだったってなることがある
79 22/12/09(金)22:40:27 No.1002321188
SQL覚えろって言われたとき微妙に仕様が違うからどれ覚えればいいのか分かんなくなる
80 22/12/09(金)22:40:45 No.1002321300
>Oracleだけしかやってない人ってnullの意味わかって無くてダメだったってなることがある それはnullが悪いよnullが
81 22/12/09(金)22:41:00 No.1002321435
select A.名前,A.教科,A.点数 from そのテーブル as A inner join (select 教科,MAX(点数) as 最高得点 from そのテーブル where 組=B組 group by 教科 ) as B on A.教科 = B.教科 and A.点数 = B.最高得点 各クラスごとに最高得点出したい場合はwhere 組=B組を消してgroup byと結合条件に加えればいいとおもう
82 22/12/09(金)22:41:15 No.1002321554
>select * from t where class = 'b' and subject = 'math' and >score = (select max(score) from t where subject = 'math' and class = 'b') >これをunionで教科の数だけつなげようぜ! 見てるだけで地獄みたいなクエリだ
83 22/12/09(金)22:41:56 No.1002321870
Oracle Databaseは現在、長さが0(ゼロ)の文字値をNULLとして処理します。ただし、将来のリリースではこの処理が変更される場合があるため、空の文字列をnullと同じように処理しないことをお薦めします。
84 22/12/09(金)22:42:11 No.1002321973
>>Oracleだけしかやってない人ってnullの意味わかって無くてダメだったってなることがある >それはnullが悪いよnullが null使うな2値論理でイキッってろって言いたい
85 22/12/09(金)22:42:51 No.1002322309
いかがでたしブログみたいな感じで普通に有益なSQL教えてるブログあるしyoutubeもあるし勉強するのかなり楽ね最近
86 22/12/09(金)22:43:39 No.1002322649
UNION死ね
87 22/12/09(金)22:44:29 No.1002322995
>>これをunionで教科の数だけつなげようぜ! >見てるだけで地獄みたいなクエリだ VIEWにこういうの入れる人がいてマジ困る UTで問題なかったのにITやSTでデータ量増えたとたん動かなくなってプログラム組んだ俺のせいにされときの屈辱は今でも忘れられない
88 22/12/09(金)22:46:47 No.1002323968
実務言い出すと学校なら総数たかが知れてるしエクセルでやればええ!ってならない?
89 22/12/09(金)22:46:50 No.1002323991
一学年の生徒数なんて3桁人程度だから非効率なクエリ書いてもええ!
90 22/12/09(金)22:47:13 No.1002324199
>各クラスごとに最高得点出したい場合はwhere 組=B組を消してgroup byと結合条件に加えればいいとおもう だから並び変えて値毎に仕分けりゃ済むことのために同じテーブルを何回もスキャンするんじゃねぇ!
91 22/12/09(金)22:47:14 No.1002324203
UNIONなんてよほどじゃない限り使うことないだろ…
92 22/12/09(金)22:47:27 No.1002324293
>実務言い出すと学校なら総数たかが知れてるしエクセルでやればええ!ってならない? エクセルは素晴らしいツールだよ
93 22/12/09(金)22:47:39 No.1002324382
Excelならやり方のイメージつくんだが
94 22/12/09(金)22:50:35 No.1002325738
>だから並び変えて値毎に仕分けりゃ済むことのために同じテーブルを何回もスキャンするんじゃねぇ! じゃあRDBMSの情報書いてくんない? そもそも正規化されてないテーブルにどの環境でも実行できるように書いたらこうなるわけなんだけど