- PR -

SQLで最新日付のデータ取得(CSV出力)

投稿者投稿内容
GORI
会議室デビュー日: 2009/01/21
投稿数: 6
投稿日時: 2009-01-21 10:15
お世話になります。
データベースOracle9i(9.2.0.7.0)において、下記のようなテーブルXから条件1に合致したレコードを下記のレイアウトのZ.CSVファイルとして出力するSQLは下記の通りでよろしかったでしょうか。

【条件1】
番号1ごとに日付1が最新で、且つ、日付2が'00000000'のレコード
番号1、番号2の昇順に並び替え

【Z.CSVファイルのレイアウト】
番号1,番号2,日付1,日付2

【テーブルX】
番号1  番号2    日付1   日付2
-------- ------------ ---------- --------
111111 1111111111 20010101 00000000
111111 1111111111 20020101 20020101
111111 1111111111 20030101 00000000
111111 1111111111 20040101 20040101
111111 2222222222 20010101 20010101
111111 3333333333 20010101 00000000
111111 3333333333 20020101 20020101
222222 4444444444 20010101 00000000
222222 4444444444 20020101 20020101
222222 4444444444 20030101 00000000
222222 5555555555 20010101 00000000
222222 6666666666 20010101 00000000
333333 7777777777 20010101 00000000
333333 7777777777 20020101 20020101
333333 7777777777 20030101 00000000
333333 8888888888 20010101 00000000
333333 8888888888 20020101 20020101
333333 8888888888 20030101 00000000
333333 8888888888 20040101 20040101

【コード】
----------------------------------------------
SET HEADING OFF
SET PAGESIZE 0
SET linesize 2000
SET feedback off
SET trimspool on
SET ECHO OFF
SPOOL Z.CSV

SELECT
番号1||','||
番号2||','||
日付1||','||
日付2||','
FROM テーブルX AS A
WHERE EXISTS
(
SELECT *
FROM テーブルX
WHERE 日付2 <> '00000000'
GROUP BY 番号1,番号2
HAVING (番号1 = A.番号1
AND MAX(日付1) = A.日付1)
)
ORDER BY 番号1,番号2;
SPOOL OFF
EXIT
----------------------------------------------
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2009-01-21 10:41
引用:

GORIさんの書き込み (2009-01-21 10:15) より:
SQLは下記の通りでよろしかったでしょうか。


実際に試してみると良いと思います。

あと、条件が良く分からないので、欲しいCSVの結果も書いてはいかがでしょうか?
GORI
会議室デビュー日: 2009/01/21
投稿数: 6
投稿日時: 2009-01-21 10:52
記入ミス1つがありました。
-------------------------------------------------------------------
【条件1】
番号1ごとに日付1が最新で、且つ、日付2が'00000000'以外のレコード
番号1、番号2の昇順に並び替え
-------------------------------------------------------------------
が正しい【条件1】となります。

一度、流してみて、結果を確認したいと思います。

ちなみに出力されて欲しいZ.CSVファイルは下記の通りとなります。
--------------------------------------
111111,1111111111,20040101,20040101
111111,2222222222,20010101,20010101
111111,3333333333,20020101,20020101
333333,8888888888,20040101,20040101
--------------------------------------
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-01-21 11:23
こんなんでもいけそうですが。

コード:

SELECT
    番号1 || ',' || 番号2 || ',' || 日付1 || ',' || 日付2 || ','
FROM
    (SELECT
        番号1,
        番号2,
        日付1,
        日付2,
        MAX(日付1) OVER(PARTITION BY 番号1) AS MAX日付1
    FROM
        テーブルX
    WHERE
        日付2 <> '00000000'
    )
WHERE
    日付1 = MAX日付1
ORDER BY
    番号1 ASC,
    番号2 ASC

よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2009-01-21 12:43
GORIさん、こんにちは。

以前にも同様の質問があったのでリンクします。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=47044&forum=26&start=0
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46590&forum=26
GORI
会議室デビュー日: 2009/01/21
投稿数: 6
投稿日時: 2009-01-23 14:31
Kingさんのやり方でやってみようと思います。

コード:
--------------------------------------------------------------------------------

SELECT
番号1 || ',' || 番号2 || ',' || 日付1 || ',' || 日付2 || ','
FROM
(SELECT
番号1,
番号2,
日付1,
日付2,
MAX(日付1) OVER(PARTITION BY 番号1) AS MAX日付1
FROM
テーブルX
WHERE
日付2 <> '00000000'
)
WHERE
日付1 = MAX日付1
ORDER BY
番号1 ASC,
番号2 ASC

【条件1】を下記の通り少し修正した場合、
上記のコードはどのような記述方法に変更となりますでしょうか。

【条件1】
番号1の中の番号2において、日付1が最新で、且つ、日付2が'00000000'以外のレコード
番号1、番号2の昇順に並び替え

お手数ですが、ご教授願います。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-01-23 14:52
【条件1】が変わる事によって何がわかりませんか?
取り敢えず出してる条件の通り動く SQL を書けって事ですか?
GORI
会議室デビュー日: 2009/01/21
投稿数: 6
投稿日時: 2009-01-23 16:08
【条件1】が「番号1ごとに・・・」から「番号1の中の番号2において・・・」に変更されることにより、
MAX(日付1) OVER(PARTITION BY 番号1) AS MAX日付1
の記述が変わるのかと思いますが、
MAX(日付1) OVER(PARTITION BY 番号2) AS MAX日付1
として流すと、番号1が異なる且つ番号2が同じ場合、番号2の中の最新日付1だけを抽出してしまい、本来、抽出されて欲しいデータが抽出されませんでした。

この条件変更により、PARTITION BY句は使用できるのか、他の記述方法でないとうまく抽出できないのかが不明なため、ご教授願いたいと思っています。

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