- - PR -
フィールド毎の、Top1を知りたい
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-08-31 15:25
下記の様なテーブル(TestA)があり、
下記の様な結果が欲しいのですが、SQLの組み立て方がわかりません。
条件として、FieldB毎にFieldAのTop1と、そのレコード数が欲しいのです。 なおDBはSQL Server2000です。よろしくお願いします。 | ||||||||
|
投稿日時: 2004-08-31 15:59
こんにちは。
FieldAつかって昇順でテーブルを並べ替えた結果に 対してFieldBでgroup byすれば良い気がしますが、、、 すいません、 深く考えてません、また、試してもいません。 #パフォーマンスが悪そうのと #サーバの設定で #もしかしたらこの方法で出来ないかも、、、 ここから追加------------ いや、FieldBでgroup byした結果を使って元のテーブルをselectするなら良いかも このときFieldAに対してmin関数使用でいいかな これも試していません。 _________________ 世界平和を願う! http://park8.wakwak.com/~chin/ [ メッセージ編集済み 編集者: CHN 編集日時 2004-08-31 16:06 ] | ||||||||
|
投稿日時: 2004-08-31 18:03
select a, b, count(a)-1 from table group by b;
| ||||||||
|
投稿日時: 2004-08-31 21:47
レスありがとうございます。
TO:コブラさん select a, b, count(a)-1 from table group by b; これだと、Group Byにaを入れてないため、エラーになると思います。 TO:CHNさん すみません、終電近いので明日試します。 | ||||||||
|
投稿日時: 2004-08-31 22:15
Top 1 って何? それじゃあ、FieldA のどのような値が得られるか保証されないよ? FieldB ごとに最小の FieldA の値と、その値を持つレコード数ということであれば…
ほんとうに質問文の通り、Top 1 で無作為な FieldA の値について 結果を得たいなら別の方法を使うことになる。 | ||||||||
|
投稿日時: 2004-08-31 23:17
hidemaru です。
これは、一発のSQL文で、やろうとすると、パフォーマンスも 落ちるのではないでしょうか? まず、順当に、 select FieldB,min(FieldA) as MinA from TestA group by FieldB これを temp table へ入れる。仮にテーブル名 TempA (SQL Server2000 でのTEMP TABLE の構文は知らないので・・・) select TempA.MinA,TempA.FieldB,count(*) from TempA,TestA where TestA.FieldA = TempA.MinA and TestA.FieldB = TempA.FieldB order by TempA.MinA こんなところでしょうか。 | ||||||||
|
投稿日時: 2004-09-01 01:34
なんじゃ、SQL Server2000 て SQL としての振る舞いもできんのか。
| ||||||||
|
投稿日時: 2004-09-01 09:15
ちょっと信じられない発言なんだけどさ、なんの根拠があって言ってんの? 実行プラン確認した? まあ、提示されているクエリ自体かなり間違いだらけなので、 何の確認もしてないであろうことは明らかだけどね。 君みたいなまともにクエリも書けない人がパーフォマンスうんぬんとか言っても 説得力ないよ。それどころか、君みたいな低脳君の発言のせいで、 「SQL Server2000 て SQL としての振る舞いもできんのか」という誤解まで 出てきちゃうわけだ。 困ったもんだ。 | ||||||||
