- PR -

SQL文について

投稿者投稿内容
いなば
会議室デビュー日: 2007/09/20
投稿数: 14
投稿日時: 2008-01-24 12:59
教えてください。
以下のようなテーブルがあり
商品コードの中でMAX日付とそれについている単価を
取得したいです。

no code date tanka
-----------------------
01 0001 2008/01/01 100
02 0001 2008/01/05 200
03 0002 2008/01/06 100
04 0003 2008/01/01 100
05 0003 2008/01/02 90

取得したい内容
code date tanka
-----------------------
0001 2008/01/05 200
0002 2008/01/06 100
0003 2008/01/02 90

一応、以下のようなSQLで結果は取れるのですが
時間がかかります。

SELECT TBL.CODE,TBL.DATE,TBL.TANKA FROM TBL TBL
WHERE EXISTS (SELECT CODE,MAX(DATE) FROM TBL TBL1
WHERE TBL.CODE = TBL1.CODE AND TBL1.DATE <= '2008/01/15'
GROUP BY CODE HAVING MAX(NO) = tjnl.NO)
ORDER BY TBL.CODE,TBL.DATE

どのようなSQL文を書けばレスポンスが早く
データを取得できるでしょうか。

よろしくお願いいたします


johnes
ベテラン
会議室デビュー日: 2007/11/21
投稿数: 50
投稿日時: 2008-01-24 13:34
とりあえずDBが何なのかを書きましょう・・・

引用:

いなばさんの書き込み (2008-01-24 12:59) より:
教えてください。
以下のようなテーブルがあり
商品コードの中でMAX日付とそれについている単価を
取得したいです。

no code date tanka
-----------------------
01 0001 2008/01/01 100
02 0001 2008/01/05 200
03 0002 2008/01/06 100
04 0003 2008/01/01 100
05 0003 2008/01/02 90

取得したい内容
code date tanka
-----------------------
0001 2008/01/05 200
0002 2008/01/06 100
0003 2008/01/02 90


MAX日付なのになぜ3行も・・・?

コード:
SELECT code, date, tanka FROM tbl WHERE date = (SELECT MAX(date) FROM tbl);


じゃダメですか?(動作確認してないけどOracle以外でも動くかな??というかOracleでも怪しいけど。)
あとはインデックスをうまく張ってやればいんじゃないでしょうか。

調べればいくらでも出てくると思うのでもうちょっと調べたほうが良いと思いますよ。この調子だと今後もこのレベルの質問をずっとここに書き込むことになって、結果が返ってくるまで何もできないということが予想されますので。。。
いなば
会議室デビュー日: 2007/09/20
投稿数: 14
投稿日時: 2008-01-24 13:45
引用:

johnesさんの書き込み (2008-01-24 13:34) より:
とりあえずDBが何なのかを書きましょう・・・



MAX日付なのになぜ3行も・・・?

コード:
SELECT code, date, tanka FROM tbl WHERE date = (SELECT MAX(date) FROM tbl);


じゃダメですか?(動作確認してないけどOracle以外でも動くかな??というかOracleでも怪しいけど。)
あとはインデックスをうまく張ってやればいんじゃないでしょうか。

調べればいくらでも出てくると思うのでもうちょっと調べたほうが良いと思いますよ。この調子だと今後もこのレベルの質問をずっとここに書き込むことになって、結果が返ってくるまで何もできないということが予想されますので。。。
[/quote]

johnesさん、ありがとうございます。
DBはオラクルです。

説明不足ですみません。
MAX日付ですが、コードごとに取得なので
0001のコードの中でのMAX日付,0002の中のMAX日付という形です。
なので、3行取得になります。

もちろん調べてあのSQLができたのですが、
かなり遅い状態なので、質問させていただいております。
いろんな方に聞いていますが、難しいということなので
こちらで質問させていただきました。

よろしくお願いいたします
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-01-24 14:59
tblに関する情報がもう少しあるとよいかもしれません。

例えば、
・noはtblの主キーですか?
・codeとdateはtblの中で一意ですか?
・同じcodeを持つデータをnoの昇順で並べると、dateも必ず昇順に並ぶことが
 アプリケーションなどで保証されていますか?
なぎさ。
会議室デビュー日: 2007/12/21
投稿数: 9
お住まい・勤務地: カンサイ
投稿日時: 2008-01-24 15:06
コード:
SELECT tbl.code, tbl.date, MAX(tbl.tanka)
FROM tbl,
  (SELECT code, MAX(date)AS mdate
   FROM tbl
   GROUP BY code)AS tblsub
WHERE tbl.code=tblsub.code
  AND tbl.date=tblsub.mdate
GROUP BY tbl.code, tbl.date
ORDER BY tbl.code;


コード 対 MAX(日付)で仮想を作って
その仮想テーブル対単価で一致するうちの単価の値を求める

求まる結果は
該当コードの最終売り上げ日(?)の最大単価
1行目をMIN(tbl.tanka)で最小単価

Oracleがすぐには準備できないので
実行環境はPostgreSQL

速度の保証はあまり自信ない


HAVINGってどうやって使うんだったっけ?
ヤバイSQL忘れかけてる
johnes
ベテラン
会議室デビュー日: 2007/11/21
投稿数: 50
投稿日時: 2008-01-24 15:29
引用:

説明不足ですみません。
MAX日付ですが、コードごとに取得なので
0001のコードの中でのMAX日付,0002の中のMAX日付という形です。
なので、3行取得になります。


こちらこそごめんなさい。読みがぜんぜん足りてなかったですね。。。

前提として、
・noが主キー
・1codeのなかではdate(YYYYMMDD)はユニーク
と仮定すると
コード:
SELECT a.code, a.date, a.tanka
FROM tbl a
,(SELECT no FROM tbl WHERE date in (SELECT max(date) FROM tbl GROUP by code)) b
WHERE a.no = b.no
ORDER BY a.code;


これで、codeとdateにインデックス張っていればコスト8出ます。
上総
大ベテラン
会議室デビュー日: 2006/06/22
投稿数: 107
投稿日時: 2008-01-24 15:55
引用:

johnesさんの書き込み(投稿日時: 2008-01-24 15:29)より
前提として、
・noが主キー
・1codeのなかではdate(YYYYMMDD)はユニーク
と仮定すると
コード:
--------------------------------------------------------------------------------

SELECT a.code, a.date, a.tanka
FROM tbl a
,(SELECT no FROM tbl WHERE date in (SELECT max(date) FROM tbl GROUP by code)) b
WHERE a.no = b.no
ORDER BY a.code;


--------------------------------------------------------------------------------


これで、codeとdateにインデックス張っていればコスト8出ます。


スレ主さんの提示している、『取得対象データ』の前提からはずれてるので
そのSQLでも無理ですよね。

引用:

スレ主さんの書き込み(投稿日時: 2008-01-24 12:59)より
SELECT TBL.CODE,TBL.DATE,TBL.TANKA FROM TBL TBL
WHERE EXISTS (SELECT CODE,MAX(DATE) FROM TBL TBL1
WHERE TBL.CODE = TBL1.CODE AND TBL1.DATE <= '2008/01/15'
GROUP BY CODE HAVING MAX(NO) = tjnl.NO)
ORDER BY TBL.CODE,TBL.DATE


どう見てもタイプミスにしか見えませんので、ソースコードそのままを記述して下さい。

コード:
SELECT     ALL
           TBL1.CODE,
           TBL1.DATE,
           TBL1.TANKA
FROM       TBL TBL1,
           (
           SELECT      ALL
                       CODE,
                       MAX ( DATE ) AS MAX_DATE
           FROM        TBL
           GROUP BY    CODE
           ) TBL2
WHERE      TBL1.CODE = TBL2.CODE
AND        TBL1.DATE = TBL2.MAX_DATE


これで上手くいくと思います。
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2008-01-24 15:57
引用:

johnesさんの書き込み (2008-01-24 15:29) より:
コード:

SELECT a.code, a.date, a.tanka
FROM tbl a
,(SELECT no FROM tbl WHERE date in (SELECT max(date) FROM tbl GROUP by code)) b
WHERE a.no = b.no
ORDER BY a.code;


これで、codeとdateにインデックス張っていればコスト8出ます。


これだと、
6行目に
no code date tanka
-----------------------
06 0001 2008/01/02 500
とかあったらOUTじゃないですか?

そもそも
元SQLでは、ほしいデータの取得さえできないように思えるのですが・・・
意味不明な条件もついているし。

[追記]
さき越されたー。
僕も上総さんの記述した内容と同じものがほしいのか?と想像していました。

[ メッセージ編集済み 編集者: KOX 編集日時 2008-01-24 16:01 ]

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