- - PR -
SQLで困っています。
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-03-16 10:47
はじめまして、以下のようなレイアウトの株価テーブルがあります。
このテーブルからそれぞれの銘柄コードの最新の行を抽出したいのですが、1回 のSQLで抽出するのが思いつきません。 例 銘柄コード、取引日付、始値、高値、安値、終値、出来高 1111 20050311 324 333 324 340 1232229 1111 20050312 340 340 322 336 1536000 1111 20050313 320 330 319 320 1266660 2222 20050311 340 340 322 336 260050 2222 20050313 320 330 319 320 963620 3333 20050311 560 563 559 563 650 3333 20050312 560 580 540 561 590 ここで注意が必要なのは、全てのコードの取引日付の最新日 が同一ではありません。銘柄によってはまったく取引されな いものものもあります。 このデータから以下のように抽出したいのです。 1111 20050313 320 330 319 320 1266660 2222 20050313 320 330 319 320 963620 3333 20050312 560 580 540 561 590 select 銘柄コード,max(取引日付) from 株価TBL group by 銘柄コード 上記のSQLで銘柄コードと取引日付は取得できるのですが 始値などが取れません。 よろしくお願いします。 | ||||||||
|
投稿日時: 2005-03-16 11:59
Access2000なら、
SELECT [a].[銘柄コード], [a].[取引日付], [a].[始値], [a].[高値], [a].[安値], [a].[終値], [a].[出来高] FROM 株価 a, (SELECT [a].[銘柄コード], MAX([a].[取引日付]) as 最新取引日付 from 株価 a group by [a].[銘柄コード]) b WHERE [a].[銘柄コード] = [b].[銘柄コード] AND [a].[取引日付] = [b].[最新取引日付] GROUP BY [a].[銘柄コード], [a].[取引日付], [a].[始値], [a].[高値], [a].[安値], [a].[終値], [a].[出来高] ORDER BY [a].[銘柄コード], [a].[取引日付]; | ||||||||
|
投稿日時: 2005-03-16 12:40
こんにちは。oracle で少しばかりサンプル書いてやってみました。
まぁ、from でレコードセットをテーブルとして利用して where 句で UNIQUE なキーと連結すれば出来そうですね。でわ。 | ||||||||
|
投稿日時: 2005-03-16 13:23
select * from 株価TBL where (銘柄コード,取引日付) in (select 銘柄コード,max(取引日付) from 株価TBL group by 銘柄コード )
とか。 | ||||||||
|
投稿日時: 2005-03-16 15:22
今日は。
と言う事で以下でどうでしょ?(by ORACLE検証済) まあ、特有のSQL使って無いので、どのDBでも行くでしょう。
SELECT * FROM テーブル名 テーブル別名 WHERE 取引日付=(SELECT MAX(取引日付) FROM テーブル名 WHERE 銘柄コード=テーブル別名.銘柄コード) ※SQL Serverでも行きます。 [ メッセージ編集済み 編集者: NAO 編集日時 2005-03-16 15:28 ] | ||||||||
|
投稿日時: 2005-03-16 16:59
ちょっと見れない間にこんなにレスを頂いてありがとうございます。
>NAOさん NAOさんに教えていただいたSQLで出来ました。 ただしこのymd=の結果セットが何故複数行になるのかが理解できませんでした。単発で発行すると取引日付の最新日1件しか抽出されないですよね。私はここで、銘柄コードを入れてGroup Byとしたのですが、当然エラーとなってしまっていました。 >ishiさん ishiさんに教えていただいた方法を試してみましたが、エラーとなってしまいました。 最初に書くべきでしたが、DBはMS Access2002でした。 >水無月 遊々さん dodoさんの例でもありましたが、from句にレコードセットをテーブルとして連結できるとは知りませんでした。 dodoさんのSQLも検証しましたが、希望通りの結果が得られました。 >dodoさん from句以降にselect文を書く方法を知りませんでした。大変参考になりました。今まで無理と思って分割していたSQLも一回で取得できそうです。 みなさんありがとうございます。 | ||||||||
|
投稿日時: 2005-03-16 17:32
私が回答したSQLを論理的に追ってみると解りますよ。
メインのクエリーがデータを選択する訳ですが、 WHERE句の後ろのサブクエリーの中の「テーブル別名.銘柄コード」は一体どこから与えられるのでしょう? ※ちなみにこれは「相関サブクエリー」という手法です。 [ メッセージ編集済み 編集者: NAO 編集日時 2005-03-16 17:51 ] | ||||||||
|
投稿日時: 2005-03-18 15:30
ありがとうございます。
こちらのサイトのSQL講座の記事を読んで勉強します。 |