> get the most frequently appearing `user_code` where the month is specified Since `user_code` is the primary key, that question would be nonsense. There can never be more than one. I assume you meant `invite_code`? Just add a `WHERE` clause. And since the column can be NULL, also consider excluding NULL values: SELECT invite_code, COUNT(*) AS counted FROM invite_table WHERE month = 'May' -- or whatever is stored in your varchar(3) column AND invite_code IS NOT NULL -- exclude NULL GROUP BY invite_code ORDER BY counted DESC, invite_code -- to break ties in deterministic fashion LIMIT 10; ### Month, date, timestamp? A month column as `varchar(3)` doesn't seem very useful if there can be data for more than a single year. I would use data type `date` for it. You can format that any way you like for presentation. Like: SELECT to_char(date '2017-12-01', 'Mon'); -- 'Dec' The column could look like this (also addressing your comment): ... , inserted_at date DEFAULT CURRENT_DATE ... The default value is entered when the column is omitted in an `INSERT` statement. Or, if really only the month is relevant: ... DEFAULT date_trunc('month', now())::date Or store the complete timestamptz (that's what I would probably do): , inserted_at timestamptz DEFAULT now() Read the manual [here][1] and [here][2]. [1]: https://www.postgresql.org/docs/current/static/ddl.html [2]: https://www.postgresql.org/docs/current/static/functions-datetime.html