[pgsql-jp: 37810] Re: 階級ごとの最大値や最小値の取り出し方を教えてください

"なかで" nakade @ prjapan.jp
2006年 12月 18日 (月) 18:57:28 JST


中出です。

レスありがとうございます。


> > という感じでしょうか?
> > ほぼ、期待どおりの結果を得ることができたのですが、usr_ckテーブル
> > に2006-12-17のデータがないものについては含むことができませんでした。
> 
> 10 で割った商だと -9 と 9 が同じ値になりませんか?
> グループ化列の加工はもう少し工夫する必要がありそうです。

おっしゃるとおりでした。
0以上の場合と0未満の場合で分岐するようにしてみました。

(case when P.pt>=0 then P.pt / 10 else (P.pt - 10)/ 10 end) as usr__pt,

> 集計すると存在しない行はでてきませんよね。
> 
> わたしがよくやるのは以下の2つの方法です。
> 
> 1.出力イメージの識別列を左に外部結合する。

こちらの方でさせていただきました。
で、作成したSQLは以下のようになりました。

select 
(case when P.pt>=0 then P.pt / 10 else (P.pt - 10)/ 10 end) as usr__pt,
max(case when C.ck is null then 0 else C.ck end) as ck_max,
min(case when C.ck is null then 0 else C.ck end) as ck_min,
avg(case when C.ck is null then 0 else C.ck end) as ck_avg,
count(case when C.ck is null then 0 else C.ck end) as ck_cnt
from usr as U
left join usr_pt as P on P.usr_id=U.id
left join (select usr_id,ck from usr_ck where chkdate='2006-12-17') as C on C.usr_id=U.id
group by usr__pt
order by usr__pt

期待通りの結果を得ることができました。
ありがとうございました。



> > 2.集計元のデータに列を加える。
> 2.集計元のデータに行を加える。
> 
> 2は、例えば usr_ck テーブルの 2006-12-17 のデータと
> chkdate が 2006-12-17 のリテラル行を UNION します。
> で、usr_ck テーブル部分をそのサブクエリに置き換えます。
> 

こちらのほうは、上記SQLの
select usr_id,ck from usr_ck where chkdate='2006-12-17'
の部分を
select usr_id,ck from usr_ck where chkdate='2006-12-17' union select id,0 from usr
のような感じにするということでしょうか?
この場合、期待する結果を得ることができませんでした。
もしよろしければ、この方法について、もう少し教えていただけると
幸いです。

では失礼します。

-- 
nakade <nakade @ prjapan.jp>





pgsql-jp メーリングリストの案内