ここから本文です

最近以下の質問をさせてもらい、上手く動作したのですが、 また、追加で※に問い合...

c52********さん

2018/10/1520:20:00

最近以下の質問をさせてもらい、上手く動作したのですが、
また、追加で※に問い合わせをさせていただきます。
恐れ入りますが、ご回答を願いいたします。

※家族番号が1111は年齢がNULLのレコードしかないため、
個人番号の一番小さいレコードを抽出する。
・UNIAN ALLなどを検討しているのですが、
知識がなく、苦戦している状況です。
他は前回と同様(一部記述を変更)で以下の抽出となります。
----------------------------------------------------------------
▼前回の問い合わせ
SMPテーブルから家族番号単位で年齢の一番若いレコードを1レコードのみ抽出する
SQLのご教授をお願いいたします。

・年齢がNULLは抽出対象外(NULLのレコードしかない場合は、
個人番号の一番小さいレコードを抽出する。)
・年齢が同じ場合は任意の1レコードを抽出
以下に抽出結果を書きました。

テーブル名:SMP データベース:オラクル
家族番号 個人番号 氏名 年齢
111, 1, 一郎, NULL
111, 2, 二郎, NULL
222, 1, 三郎, 22
222, 2, 四郎, 22
222, 3, 五郎, NULL
222, 4, 六郎, 29
333, 5, 七郎, 30
333, 6, 八郎, 25

▽抽出結果
家族番号 個人番号 氏名 年齢
111, 1, 一郎, NULL
222, 1, 三郎, 22
333, 6, 八郎, 25

以上です。よろしくお願いいたします。

閲覧数:
16
回答数:
1
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

nor********さん

2018/10/1522:47:17

> 家族番号単位で年齢の一番若いレコードを1レコードのみ抽出する
> ・年齢がNULLは抽出対象外(NULLのレコードしかない場合は、
> 個人番号の一番小さいレコードを抽出する。)
> ・年齢が同じ場合は任意の1レコードを抽出

「年齢が同じ場合は任意の1レコード」にこだわりますか?

select 家族番号,個人番号,氏名,年齢
from (
select *,
row_number() over( partition by 家族番号 order by 年齢 nulls last, 個人番号 ) rn
from smp )
where rn = 1
order by 家族番号, rn;

ならそれなりにいけるかなと思いましたがOracle11gR2(11.2.0.1.0)だとバグがあるよう。
とりあえず

select 家族番号,個人番号,氏名,年齢
from (
select smp.*,
row_number() over( partition by smp.家族番号 order by smp.年齢 nulls last, smp.個人番号 ) rn
from smp )
where rn = 1
order by 家族番号, rn;

だと通るようです。
並び順でNULLのものを後ろに持っていくことでNULL以外のものが優先されます。
この場合は年齢が同じ場合は個人番号が小さいものを抽出します。任意ではありません。

select 家族番号,個人番号,氏名,年齢
from (
select smp.*,
row_number()
over( partition by smp.家族番号
order by smp.年齢 nulls last,
case when smp.年齢 is null then smp.個人番号 else 0 end ) rn
from smp )
where rn = 1
order by 家族番号, rn;

なら「年齢が同じ場合は任意の1レコード」になるでしょうか。
あまり意味はない気もしますが。

この質問は投票によってベストアンサーに選ばれました!

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる