• ベストアンサー

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にすればよいてすか?

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

こんな感じでもいいかもしれません。 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)) );

sql1204
質問者

お礼

ありがとうございます 集計関数を使わなくてもいけるんですね、勉強になりました。

その他の回答 (4)

回答No.5

相関サブクエリは遅くなりがちです。 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;

sql1204
質問者

お礼

ありがとうございます 参考にしてみます

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

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

sql1204
質問者

お礼

ありがとうございます データベースはMSAccessです ※MSAでは対応してないようです。「EXISTSを使用していない・・・」

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>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)であればどちらを取っていいのかわかりません。

sql1204
質問者

補足

早速のご回答ありがとうございます 説明不足ですみません 具体的に言うとF1が社員番号、F2が売上日、F3が伝票番号(入力順番)だとして 社員がA・B・Cいたとして社員毎に最大売上日の最大伝票番号が知りたい場合 どのようなSQLになるかが知りたいのですが?

回答No.1

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; です。

sql1204
質問者

お礼

早速のご回答ありがとうございます 試してみます

sql1204
質問者

補足

教えて頂いたSQLで確認出来ました。 ありがとうございます。 ※かなり問合せに時間はかかるようですね

関連するQ&A