- PR -

SQLで困っています。

投稿者投稿内容
FX
常連さん
会議室デビュー日: 2004/12/06
投稿数: 49
投稿日時: 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で銘柄コードと取引日付は取得できるのですが
始値などが取れません。

よろしくお願いします。
dodo
ベテラン
会議室デビュー日: 2004/05/12
投稿数: 99
お住まい・勤務地: 東京都渋谷区
投稿日時: 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].[取引日付];
水無月 遊々
大ベテラン
会議室デビュー日: 2003/10/22
投稿数: 139
お住まい・勤務地: お星様☆彡
投稿日時: 2005-03-16 12:40
引用:

FXさんの書き込み (2005-03-16 10:47) より:

銘柄コード、取引日付、始値、高値、安値、終値、出来高
1111    20050311 324  333  324  340  1232229
1111    20050312 340  340  322  336  1536000

select 銘柄コード,max(取引日付) from 株価TBL
group by 銘柄コード

上記のSQLで銘柄コードと取引日付は取得できるのですが
始値などが取れません。



こんにちは。oracle で少しばかりサンプル書いてやってみました。

コード:
データ:
       ID NAME                 GRP
--------- -------------------- -----
        1 1st                  a
        2 2nd                  a
        3 3rd                  a
        4 4th                  b
        5 5th                  b
        6 6th                  b

SQL:
select main.id, main.name, main.grp
from 
  ( select max(id) as id , grp from max_test group by grp ) sch,
  max_test main 
where main.id = sch.id order by id ;

結果:
       ID NAME                 GRP
--------- -------------------- -----
        3 3rd                  a
        6 6th                  b



まぁ、from でレコードセットをテーブルとして利用して where 句で UNIQUE なキーと連結すれば出来そうですね。でわ。
ishi
会議室デビュー日: 2004/07/16
投稿数: 17
投稿日時: 2005-03-16 13:23
select * from 株価TBL where (銘柄コード,取引日付) in (select 銘柄コード,max(取引日付) from 株価TBL group by 銘柄コード )

とか。
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2005-03-16 15:22
今日は。

と言う事で以下でどうでしょ?(by ORACLE検証済)
まあ、特有のSQL使って無いので、どのDBでも行くでしょう。 

引用:

銘柄コード、取引日付、始値、高値、安値、終値、出来高
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


SELECT * FROM テーブル名 テーブル別名 WHERE 取引日付=(SELECT MAX(取引日付) FROM テーブル名 WHERE 銘柄コード=テーブル別名.銘柄コード)

※SQL Serverでも行きます。

[ メッセージ編集済み 編集者: NAO 編集日時 2005-03-16 15:28 ]
FX
常連さん
会議室デビュー日: 2004/12/06
投稿数: 49
投稿日時: 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も一回で取得できそうです。

みなさんありがとうございます。
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2005-03-16 17:32
引用:

FXさんの書き込み (2005-03-16 16:59) より:
ちょっと見れない間にこんなにレスを頂いてありがとうございます。

>NAOさん
NAOさんに教えていただいたSQLで出来ました。
ただしこのymd=の結果セットが何故複数行になるのかが理解できませんでした。単発で発行すると取引日付の最新日1件しか抽出されないですよね。私はここで、銘柄コードを入れてGroup Byとしたのですが、当然エラーとなってしまっていました。


私が回答したSQLを論理的に追ってみると解りますよ。

引用:

SELECT * FROM テーブル名 テーブル別名 WHERE 取引日付=(SELECT MAX(取引日付) FROM テーブル名 WHERE 銘柄コード=テーブル別名.銘柄コード)


メインのクエリーがデータを選択する訳ですが、
WHERE句の後ろのサブクエリーの中の「テーブル別名.銘柄コード」は一体どこから与えられるのでしょう? 

※ちなみにこれは「相関サブクエリー」という手法です。

[ メッセージ編集済み 編集者: NAO 編集日時 2005-03-16 17:51 ]
FX
常連さん
会議室デビュー日: 2004/12/06
投稿数: 49
投稿日時: 2005-03-18 15:30
ありがとうございます。
こちらのサイトのSQL講座の記事を読んで勉強します。

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