- ベストアンサー
SQL初心者のための最大値の求め方
- この記事では、SQL初心者の方向けに、最大値を求める方法について解説します。
- 具体的な例として、社員ごとの労働時間を集計し、最も労働時間が長い人の情報を表示する方法について説明します。
- 従来の方法ではGROUP BY句とMAX関数を組み合わせることで最大値を求めることができましたが、今回の要件ではGROUP BYの式として指定できないため、別の方法を考える必要があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
普通にグループ化し、労働時間の降順に並べたものの先頭だけ 抽出すれば良いのではないですか? SELECT * FROM (SELECT SCODE, NAME, MAX(TIME) LONGEST FROM (SELECT TAR SCODE, MAX(NAME) NAME, SUM(WORK_TIME) TIME FROM NIP, MTOR WHERE NIP.TOR = MTOR.CODE AND DDATE BETWEEN '2008/04/21' AND '2008/05/20' GROUP BY TAR) GROUP BY SCODE, NAME) WHERE ROWNUM=1 ORDER BY LONGEST DESC
その他の回答 (2)
- nda23
- ベストアンサー率54% (777/1415)
言葉の上ではそうです。 SELECT文のFROMが、絞り込まれたクエリであるというだけです。 例えば、SELECT * FROM XXX を考える時、XXXがTABLEでなく、VIEWであったら、 どう考えますか?FROM句の元がテーブルか、クエリかということは気にする必要は ありません。それが、ネストしていたとしても、「たまたま」なのです。 というより、昔のDBシステムは遅かったので、こういう「絞り込み」は半ば常識でした。 「降順で並べた先頭レコードだけを抽出する」という考え方で、ROWNUM=1は ORACLEの方言です。他ではTOP、LIMITというキーワードがあり、使用方法も異なります。
- auty
- ベストアンサー率58% (284/486)
SELECT SCODE , NAME , TIME ***** 変更あり FROM (SELECT TAR SCODE , MAX(NAME) NAME , SUM(WORK_TIME) TIME FROM NIP , MTOR WHERE NIP.TOR = MTOR.CODE AND DDATE BETWEEN '2008/04/21' AND '2008/05/20' GROUP BY TAR) T ***** 変更あり WHERE TIME = ( SELECT max(T.TIME) from T ) ***** 追加あり の様な形で動かないでしょうか。
お礼
アドバイス大変参考になります。 早速明日試みてみたいと思います。 本当にありがとうございます。
お礼
アドバイスありがとうございます。 「労働時間の降順に並べたものの先頭だけ 抽出すれば良い」 という考え方ができるんですね。 これは、副問い合わせのなかで、また副問い合わせをしている という考え方でよろしいんでしょうか? 初心者なので間違った認識をしているかもしれませんが… そして降順で並べたものをROWNUMで1行取り出していると 解釈してもいいんでしょうか? 何度も申し訳ありません。