- PR -

PostgreSQLで『各月の上位3件ずつ』

1
投稿者投稿内容
ほまらら
ベテラン
会議室デビュー日: 2005/10/19
投稿数: 54
投稿日時: 2006-02-24 12:14
お世話になります。
SQL文についての質問なのですが、Timestamp型とInteger型の2つのカラム(timeColumn,intColumn)を持つテーブル(sourceTable)に、不特定期間のデータがあるとして、そのデータを日毎にintColumnの上位3件ずつ表示させるということは1つのSQL文で可能でしょうか?

例えば3件ずつではなく1件ずつならば、以下のようなSQL文で実現できると思うのですが。
SELECT date_trunc('day',timeColumn) AS timeInfo,MAX(intColumn) FROM sourceTable GROUP BY timeInfo ORDER BY timeInfo;

使用しているPostgreSQLは7.4です。
お判りになる方、宜しくお願いします。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-02-24 12:44
こんなんどうでしょうか?

test3テーブルはvalue,col1と共に文字列型ですが。

コード:
insert into test3 values ( 'aaa', '1') ;
insert into test3 values ( 'aaa', '2') ;
insert into test3 values ( 'aaa', '3') ;
insert into test3 values ( 'aaa', '4') ;
insert into test3 values ( 'aaa', '5') ;
insert into test3 values ( 'bbb', '1') ;
insert into test3 values ( 'ccc', '2') ;
insert into test3 values ( 'ccc', '3') ;
insert into test3 values ( 'ccc', '4') ;

select * from test3 
where ( value, col1) in ( select value,col1 from test3 b where b.value = test3.value order by col1 limit 3 ) ;




コード:
value : col1
-------------
"aaa";"1  "
"aaa";"2  "
"aaa";"3  "
"bbb";"1  "
"ccc";"2  "
"ccc";"3  "
"ccc";"4  "

明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2006-02-24 13:24
where句でサブクエリで順位を求めて、
3位以内のデータを対象とすればできます

同一timeColumnでintColumnが等しいデータが存在しないなら、
夏椰|。σ)oさんの方法でもいいかと
ほまらら
ベテラン
会議室デビュー日: 2005/10/19
投稿数: 54
投稿日時: 2006-02-24 14:13
夏椰|。σ)oさん、明智重蔵さん、ご返答ありがとうございます。

夏椰|。σ)oさんにご紹介いただいた方法は、上手く動きそうなのですが、
上手く動く理屈が理解できませんのでもっと勉強して理解を深める所存です。

明智重蔵さんにご紹介いただいた方法も、サブクラスで各日の順位を求める方法を探して試みてみます。

お二方ありがとうございました。
1

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