- - PR -
SQLで最新日付のデータ取得(CSV出力)
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 ---------------------------------------------- | ||||
|
投稿日時: 2009-01-21 10:41
実際に試してみると良いと思います。 あと、条件が良く分からないので、欲しいCSVの結果も書いてはいかがでしょうか? | ||||
|
投稿日時: 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 -------------------------------------- | ||||
|
投稿日時: 2009-01-21 11:23
こんなんでもいけそうですが。
| ||||
|
投稿日時: 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 | ||||
|
投稿日時: 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の昇順に並び替え お手数ですが、ご教授願います。 | ||||
|
投稿日時: 2009-01-23 14:52
【条件1】が変わる事によって何がわかりませんか?
取り敢えず出してる条件の通り動く SQL を書けって事ですか? | ||||
|
投稿日時: 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句は使用できるのか、他の記述方法でないとうまく抽出できないのかが不明なため、ご教授願いたいと思っています。 |