- PR -

フィールド毎の、Top1を知りたい

投稿者投稿内容
うきょきょ
常連さん
会議室デビュー日: 2004/01/09
投稿数: 44
投稿日時: 2004-08-31 15:25
下記の様なテーブル(TestA)があり、
コード:
FieldA FieldB FieldC
------ ------ ------
1      A      AA
1      A      BB
2      A      CC
2      B      BB
2      B      CC
3      B      DD
5      C      EE
8      C      FF



下記の様な結果が欲しいのですが、SQLの組み立て方がわかりません。
コード:
FieldA FieldB Count(*)
------ ------ --------
1      A      2
2      B      2
5      C      1



条件として、FieldB毎にFieldAのTop1と、そのレコード数が欲しいのです。
なおDBはSQL Server2000です。よろしくお願いします。
CHN
ぬし
会議室デビュー日: 2002/03/07
投稿数: 382
投稿日時: 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 ]
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-08-31 18:03
select a, b, count(a)-1 from table group by b;
うきょきょ
常連さん
会議室デビュー日: 2004/01/09
投稿数: 44
投稿日時: 2004-08-31 21:47
レスありがとうございます。

TO:コブラさん
select a, b, count(a)-1 from table group by b;

これだと、Group Byにaを入れてないため、エラーになると思います。


TO:CHNさん
すみません、終電近いので明日試します。
未記入
大ベテラン
会議室デビュー日: 2003/11/24
投稿数: 121
投稿日時: 2004-08-31 22:15
引用:

条件として、FieldB毎にFieldAのTop1と、そのレコード数が欲しいのです。


Top 1 って何? それじゃあ、FieldA のどのような値が得られるか保証されないよ?
FieldB ごとに最小の FieldA の値と、その値を持つレコード数ということであれば…
コード:
select
  FieldA = min(FieldA),
  FieldB,
  cnt = (select count(*) from TestA as t2 where t2.FieldB = t1.FieldB and t2.FieldA = min(t1.FieldA)) 
from TestA as t1 group by FieldB


ほんとうに質問文の通り、Top 1 で無作為な FieldA の値について
結果を得たいなら別の方法を使うことになる。
hidemaru
常連さん
会議室デビュー日: 2004/03/22
投稿数: 44
投稿日時: 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

こんなところでしょうか。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-09-01 01:34
 なんじゃ、SQL Server2000 て SQL としての振る舞いもできんのか。
未記入
大ベテラン
会議室デビュー日: 2003/11/24
投稿数: 121
投稿日時: 2004-09-01 09:15
引用:

これは、一発のSQL文で、やろうとすると、パフォーマンスも
落ちるのではないでしょうか?


ちょっと信じられない発言なんだけどさ、なんの根拠があって言ってんの?
実行プラン確認した? まあ、提示されているクエリ自体かなり間違いだらけなので、
何の確認もしてないであろうことは明らかだけどね。

君みたいなまともにクエリも書けない人がパーフォマンスうんぬんとか言っても
説得力ないよ。それどころか、君みたいな低脳君の発言のせいで、
「SQL Server2000 て SQL としての振る舞いもできんのか」という誤解まで
出てきちゃうわけだ。

困ったもんだ。

スキルアップ/キャリアアップ(JOB@IT)