PostgreSQL

Postgresでdistinct onしながらcountしようとしたらハマった

やろうとしたこと

あるサービスのアクセスユーザー数をセッション単位で数えたかった

table名:user_browsing_log

列名 Type note
session_id text セッションid
browsing_at timestamp without time zone アクセス日時

最初に作ったSQL

first.sql
select distinct on(session_id) count(*) from user_browsing_log;

実行結果

ERROR: column "user_browsing_log.session_id" must appear in the GROUP BY clause or be used in an aggregate function

session_idをgroup byせよとのこと

2番目に作ったSQL

second.sql
select distinct on(session_id) count(*) from user_browsing_log group by session_id;

でもこうするとあるsession_idが何回アクセスしたか、になってしまう、、、、

正解
correct.sql
select count(distinct session_id) from user_browsing_log;

めっちゃ単純だしsqlにしてみると当たり前も当たり前な感じだった

ある列だけを基準にdistinctして他の列も取得するときのdistinct onを使う場合が固定概念になってしまってハマっていた