- ベストアンサー
SQLについて教えてください テーブルAの項目はF
QLについて教えてください テーブルAの項目はF1,F2,F3で内容が F1,F2,F3 1, 0, 0 1, 1, 0 1, 1, 1 1, 1, 2 2, 1, 1 2, 1, 2 3, 1, 0 3, 2, 2 3, 2, 3 F1をグループ化しF2の最大値の中でさらにF3が最大の行を取得したいのですが どのようなSQLにすればよいてすか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じでもいいかもしれません。 select * from テーブルA T1 where not exists ( select * from テーブルB T2 where T2.F1 = T1.F1 and (T2.F2 > T1.F2 or (T2.F2 = T1.F2 and T2.F3 > T1.F3)) );
その他の回答 (4)
- hatena1989
- ベストアンサー率87% (378/433)
相関サブクエリは遅くなりがちです。 F1グループ化、F2最大の集計クエリを作成する。 これと元のテーブルと内部結合した集計クエリで、F1, F2 グループ化、F3最大 というようにクエリを2段にすればいいでしょう。 サブクエリを使えば、一つのクエリにできます。 SELECT F1, F2, MAX(テーブルA.F3) AS F3 FROM テーブルA INNER JOIN (SELECT F1, MAX(F2) AS MaxF2 FROM テーブルA GROUP BY F1) Q ON テーブルA.F1=Q.F1 And テーブルA.F2=Q.MaxF2 GROUP BY F1,F2;
お礼
ありがとうございます 参考にしてみます
- yambejp
- ベストアンサー率51% (3827/7415)
SQLの種類やバージョンによってSQL文は異なりますが 社員ごとの最終日の最終伝票番号をとりたいということであればこんな感じ。 レコードが多数あるようであれば適切なインデックスが必要です select F1,F2,MAX(F3) AS F3 from hoge WHERE (F1,F2) IN (select F1,MAX(F2) from hoge GROUP BY F1) GROUP BY F1,F2
お礼
ありがとうございます データベースはMSAccessです ※MSAでは対応してないようです。「EXISTSを使用していない・・・」
- yambejp
- ベストアンサー率51% (3827/7415)
>F1をグループ化しF2の最大値の中でさらにF3が最大の行を取得 今回の命題だと、F2が最大値のF1にあたるレコードのF3の最大値を取得する場合 (1)F1値が複数あった場合、F3を複数得るのか (2)F1値が複数あった場合でもF3同士の最大値を持つレコードを得るのか わかりません。 今回の例示であれば「3,2,3」が得られますが かりに、「1,2,4」があった場合、解は (1)であれば「1,2,4」と「3,2,3」の両方を取る (2)であれば「1,2,4」のみとなります またそれとは別に仮に「4,2,3」があった場合 (1)であれば「3,2,3」と「4,2,3」の両方を取りますが (2)であればどちらを取っていいのかわかりません。
補足
早速のご回答ありがとうございます 説明不足ですみません 具体的に言うとF1が社員番号、F2が売上日、F3が伝票番号(入力順番)だとして 社員がA・B・Cいたとして社員毎に最大売上日の最大伝票番号が知りたい場合 どのようなSQLになるかが知りたいのですが?
- 原沢 信道(@nharasawa)
- ベストアンサー率53% (90/168)
select F1,F2,max(F3) from tbl t1 where F2=(select max(F2) from tbl t2 where t2.F1=T1.F1) group by F1,F2 order by 1; です。
お礼
早速のご回答ありがとうございます 試してみます
補足
教えて頂いたSQLで確認出来ました。 ありがとうございます。 ※かなり問合せに時間はかかるようですね
お礼
ありがとうございます 集計関数を使わなくてもいけるんですね、勉強になりました。