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 NULLnull, also consider excluding NULLnull 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;
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 -- 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 with to_char()
to_char()
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()LOCALTIMESTAMP)::date
OrEither introduces a dependency on the timezone
setting of the current session. I would rather store the complete timestamptz
to begin with (8 bytes, that's what I would probably do):
...
, inserted_at timestamptz DEFAULT now()
...
Read the manual herehere and herehere.
And be aware that date and timestamp depend on your current time zone setting. Detailssee: