ORACLE TECHNOLOGY NETWORK
 
 
   

Oracle Technology Network (OTN) Japan - 掲示板 » コミュニティ » 初心者の部屋

スレッド: 有効期間のあるデータの抽出方法

このスレッドに返信する このスレッドに返信する スレッド一覧へ スレッド一覧へ

Permlink 返信数: 7 - 最新投稿 : 2004/09/06 15:09 最新投稿者: taro - スレッド表示形式:
taro

投稿数: 60
登録日時: 97/01/21


有効期間のあるデータの抽出方法
投稿時刻: 2004/09/06 14:22
  このスレッドに返信します… 返信

SQL(ビュー作成)に関しての相談です

以下のマスタテーブルから有効なデータのみをビューの形で
取り出せないか? との相談を受けました。

経験ではプログラム側で判断ロジックを使って有効データの
抽出をした事しかなかったためSQLのみで実装する方法が
あるかどうかについて皆様のお知恵を拝借できれば思い投稿
させていただきました。

マスタテーブル
ID 連番 名称 発効年月日 失効年月日
--------------------------------------------
A01 1 ○○商店 1980/04/01 2001/12/31
A02 1 (株)△△商事 1990/04/01 9999/12/31
A03 1 □□商会 2000/04/01 2003/12/31
A03 2 (株)□□ 2004/01/01 9999/12/31
B01 1 ××興業 2004/10/01 9999/12/31
B02 1 (株)○○組 2001/10/01 9999/12/31
B02 2 ○△○△ 2004/04/01 9999/12/31


取り出したいデータ(SYSDATE=2004/09/10)
ID 連番 名称 発効年月日 失効年月日
--------------------------------------------
A02 1 (株)△△商事 1990/04/01 9999/12/31
A03 2 (株)□□ 2004/01/01 9999/12/31
B02 2 ○△○△ 2004/04/01 9999/12/31
※B02のようにデータが重複した場合は連番の大きいレコード
 を取得させたい

お手数をお掛けしますがよろしくお願いします。

#ORACLEのお守り役していたらSQLのパズルをいっぱい放りな
 げられて泣かされています(T_T)
 副問い合わせやら相関問い合わせやらの適切な参考書や参考
 サイトあれば教えていただけませんか?

ushitaki

投稿数: 7,079
登録日時: 98/10/30


RE:有効期間のあるデータの抽出方法
投稿時刻: 2004/09/06 14:41   taro さんへの返信です。 taro さんへの返信です。
  このスレッドに返信します… 返信

> 副問い合わせやら相関問い合わせやらの適切な参考書や参考
> サイトあれば教えていただけませんか?

Joe Celko で検索すると
「プログラマのためのSQL」とか
"Joe Celko's SQL Puzzles and Answers"とか
いろいろあっったような。


taro

投稿数: 60
登録日時: 97/01/21


RE[1]:有効期間のあるデータの抽出方法
投稿時刻: 2004/09/06 15:09   ushitaki さんへの返信です。 ushitaki さんへの返信です。
  このスレッドに返信します… 返信

>Joe Celko で検索すると
>「プログラマのためのSQL」とか
>"Joe Celko's SQL Puzzles and Answers"とか
>いろいろあっったような。

うげぇ
・・・た、高い・・・<4500円

#その昔購入したパフォーマンスチューニングか何かの本は
 それ以上したような気もするが・・・(^^;

hoge

投稿数: 11,812
登録日時: 99/03/15


RE:有効期間のあるデータの抽出方法
投稿時刻: 2004/09/06 14:43   taro さんへの返信です。 taro さんへの返信です。
  このスレッドに返信します… 返信

>経験ではプログラム側で判断ロジックを使って有効データの
>抽出をした事しかなかったためSQLのみで実装する方法が
>あるかどうかについて皆様のお知恵を拝借できれば思い投稿
>させていただきました。
>取り出したいデータ(SYSDATE=2004/09/10)
>ID 連番 名称 発効年月日 失効年月日
>--------------------------------------------
>A02 1 (株)△△商事 1990/04/01 9999/12/31
>A03 2 (株)□□ 2004/01/01 9999/12/31
>B02 2 ○△○△ 2004/04/01 9999/12/31
>※B02のようにデータが重複した場合は連番の大きいレコード
> を取得させたい

8iEE以上でしたら以下でどうでしょう。

select ID,連番,名称,発効年月日,失効年月日
from(
select ID,連番,名称,発効年月日,失効年月日
,row_number() over (partition by ID order by 連番 desc) rn
from マスタテーブル
where 発効年月日 <= trunc(sysdate) and 失効年月日 >= trunc(sysdate)
)
where rn = 1
order by ID,連番;



hoge

投稿数: 11,812
登録日時: 99/03/15


RE[1]:有効期間のあるデータの抽出方法
投稿時刻: 2004/09/06 14:46   hoge さんへの返信です。 hoge さんへの返信です。
  このスレッドに返信します… 返信

分析関数を使用しない場合は以下のようになるかと思います。

select ID,連番,名称,発効年月日,失効年月日
from マスターテーブル a
where 連番 = (select max(連番)
from マスターテーブル b
where a.ID = B.ID and 発効年月日 <= trunc(sysdate) and 失効年月日 >= trunc(sysdate))
order by ID,連番;



taro

投稿数: 60
登録日時: 97/01/21


RE[2]:有効期間のあるデータの抽出方法
投稿時刻: 2004/09/06 15:07   hoge さんへの返信です。 hoge さんへの返信です。
  このスレッドに返信します… 返信

>分析関数を使用しない場合は以下のようになるかと思います。
今回の対象システムはEEではないので分析関数は使えませんので
こちらを参考にさせていただきます。

>select ID,連番,名称,発効年月日,失効年月日
>from マスターテーブル a
>where 連番 = (select max(連番)
> from マスターテーブル b
> where a.ID = B.ID and 発効年月日 <= trunc(sysdate) and 失効年
月日 >= trunc(sysdate))
>order by ID,連番;
こちらはWeher句に指定ですか・・・

・・・う”〜ん 奥が深い(^^;
時間、今日1日くらいはもらえるようなので手元でゴリゴリと解読
させていただきます。


qze04626

投稿数: 717
登録日時: 00/09/11


Re: 有効期間のあるデータの抽出方法
投稿時刻: 2004/09/06 14:44   taro さんへの返信です。 taro さんへの返信です。
  このスレッドに返信します… 返信

>経験ではプログラム側で判断ロジックを使って有効データの

有効の定義は、発効年月日<=sysdate and 失効年月日>sysdate ということでよ
ろしいですか?

select a.*
from
マスタテーブル a,
(
select id,max(連番) as 連番
from マスタテーブル
where 発効年月日<=sysdate and 失効年月日>sysdate
group by id
) b
where
a.ID=b.ID and
a.連番=b.連番

taro

投稿数: 60
登録日時: 97/01/21


RE:Re: 有効期間のあるデータの抽出方法
投稿時刻: 2004/09/06 15:05   qze04626 さんへの返信です。 qze04626 さんへの返信です。
  このスレッドに返信します… 返信

>有効の定義は、発効年月日<=sysdate and 失効年月日>sysdate ということで

>ろしいですか?
はい、現時点では上記仕様との事でした。

>select a.*
>from
>マスタテーブル a,
>(
> select id,max(連番) as 連番
> from マスタテーブル
> where 発効年月日<=sysdate and 失効年月日>sysdate
> group by id
>) b
>where
>a.ID=b.ID and
>a.連番=b.連番

FROM句で指定ですね。
参考にさせていただきます。




ウェブサイトのご使用条件 | 個人情報保護基本方針/情報保護基本方針