• ベストアンサー

PostgresのSQL文

誕生日を取得するSQLとして以下の文を発行し、 -- 誕生日の並び替え(多い順) select trunc((current_date - to_date(birth,'YYYY/MM/DD'))/365) as age, count(*) as cnt from tb_custom_user where birth is not null group by age order by cnt desc; 次の結果を得ました。 age | cnt -----+----- 25 | 2 26 | 1 28 | 1 (3 rows) cntが最大数のときのageだけを取得したい場合、 上記のSQLをどう変更すればいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

こんにちは 頭の体操という感じで作ってみました. もっとスマートなやり方があるのかも知れませんが... select age, cnt from (select trunc((current_date - to_date(birth,'YYYY/MM/DD'))/365.0) as age, count(*) as cnt from tb_custom_user where birth is not null group by age order by cnt desc) as cntsql JOIN (select max(cnt) as maxcnt from (select trunc((current_date - to_date(birth,'YYYY/MM/DD'))/365.0) as age, count(*) as cnt from tb_custom_user where birth is not null group by age order by cnt desc) as cntsql ) as maxsql ON cntsql.cnt = maxsql.maxcnt; cntsql: wantedさんが作られたSQL maxsql: 最大値を求めるSQL これで,最大値の人が複数でもだいじょうぶです. いかがでしょうか?

wanted
質問者

お礼

回答有難うございます。 すぐには、なかなか思いつかない方法ですね。

その他の回答 (1)

回答No.1

以下のSQL文でどうでしょう? 上位1件が表示するようにwhere句に"rownum"を付け足しました。 select trunc((current_date - to_date(birth,'YYYY/MM/DD'))/365) as age, count(*) as cnt from tb_custom_user where birth is not null rownum = 1 group by age order by cnt desc;

wanted
質問者

お礼

そうでした。rownumがありました。 ありがとございます。

関連するQ&A