- PR -

SQLでの最新日のデータの取得方法

投稿者投稿内容
s_saku
会議室デビュー日: 2006/05/30
投稿数: 14
投稿日時: 2008-10-30 16:11
お世話になります。
下記のようなデータの中から、品番ごとに最新日の単価を取得するようなSQLを記述することはできるのでしょうか?

コード:
品番     単価   購入日
-------- ------ ----------
AAAA      550.0 2008/10/10
AAAA      400.0 2008/09/11
AAAA      400.0 2008/09/03
AAAA      500.0 2008/06/04
BBBB      225.0 2008/07/20
BBBB      230.0 2008/06/14
BBBB      210.0 2008/03/01
CCCC      400.0 2008/06/10
CCCC      400.0 2008/03/03
CCCC      400.0 2007/12/25
CCCC      410.0 2007/11/06



よろしくお願いいたします。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2008-10-30 16:20
普通に GROUP BY で取れませんか?
それよりデータベースは何ですか?
s_saku
会議室デビュー日: 2006/05/30
投稿数: 14
投稿日時: 2008-10-30 16:32
データベースはOracle9i(9.2.0.7.0)です。

GROUP BYで下記のような記述をした場合、エラーになってしまいます。

コード:
SELECT 品番,単価,MAX(購入日) FROM 購入実績 GROUP BY 品番



よろしくお願いいたします。
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2008-10-30 16:49
GROUP BY と HAVING でできますよ。
やんち
常連さん
会議室デビュー日: 2008/10/24
投稿数: 32
投稿日時: 2008-10-30 17:23
> GROUP BYで下記のような記述をした場合、エラーになってしまいます。
コード:
SELECT 品番,単価,MAX(購入日) FROM 購入実績 GROUP BY 品番



GROUP BY を使用して場合、SELECT句に記述出来るのは、GROUP BYで指定したカラム(品番)
もしくは、集計関数を用いた結果(MAX(購入日))のみとなります。
対応する単価が必要なら、テーブル結合で取って来ると良いと思います。

コード:
SELECT T1.品番, T2.単価, T2.購入日
FROM
	(SELECT 品番,MAX(購入日) AS MAX購入日 FROM 購入実績 GROUP BY 品番) T1
	, 購入実績 T2 
WHERE T1.品番 = T2.品番 AND T1.MAX購入日 = T2.購入日



こんな感じでしょうか。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2008-10-30 17:32
コード:
SELECT
    品番, 単価
FROM
    購入実績 AS A
WHERE
    EXISTS
    (
        SELECT *
        FROM  購入実績
        GROUP BY 品番
        HAVING 品番 = A.品番 AND MAX(購入日) = A.購入日
    )


とか。
ただし品番と購入日がキーになると考えるとです。
同じ品番、購入日のレコードが複数ある場合はまた別の方法にしないといけないと思います。
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2008-10-30 21:26
(品番、購入日)の複合キーで、ユニークになるのでしょうかね?
そういったことも、事前に説明してください。

Oracle自体、もう何年も使っていないのですが、分析関数を使った方が記述も簡単で、性能も出たりしませんか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-10-30 21:31
自分もやんちさんや、Kingさんと同じく、
品番と最新日の組み合わせを、
サブクエリで用意する方法しか思いつきませんでしたが、
Java僧さんのおっしゃるGROUP BY と HAVINGを使った方法を知りたいです。

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