So from my table where I have columns: name, date
I would like to select names that repeat point out how many times they repeat and then from the rows with same names I want to print out earlies and latest date for that name.
After all my table would have columns: name, how many, earliest date, latest date
SELECT
name,
COUNT(name) AS ilosc,
MIN(createdDate) as earliest date,
MAX(createdDate) AS latest date
FROM Clients
GROUP BY name
HAVING COUNT(name)>1
WHERE name IS NOT NULL;
I am not sure though if MIN and MAX functions will take into consideration values only from places with the same name or they will take into consideration all the fields.
Do I need to add additional WHERE statements for MIN and MAX functions so they only choose fields with the same names?
sample database that I will be using is:
(NULL,'20160101 20:36:12'),
('MARK','20160101 20:38:27'),
('BOB','20160101 20:39:02'),
('MARK','20160101 20:41:55'),
('MARK','20160101 20:42:31'),
('MARK','20160101 20:51:11'),
('MARK','20160101 20:51:24'),
(NULL,'20160101 20:52:01'),
('BOB','20160101 20:53:07'),
('BOB','20160101 20:53:44'),
('KATE','20160101 20:54:52'),
(NULL,'20160101 20:54:57'),
('JOEL','20160101 20:54:59'),
(NULL,'20160101 20:55:03'),
(NULL,'20160101 20:56:12'),
('KATE','20160101 20:57:22'),
('JOEL','20160101 20:58:31'),
('JOEL','20160101 20:59:41'),
('JOEL','20160101 21:02:02'),
('JOEL','20160101 21:03:59'),
('MARK','20160101 21:42:31'),
('MARK','20160101 21:51:11'),
('MARK','20160101 21:51:24')
Advertisement
Answer
First, the correctly formed query looks like:
SELECT name,
COUNT(*) AS ilosc,
MIN(createdDate) as earliest_date,
MAX(createdDate) as latest_date
FROM Klienci
WHERE name IS NOT NULL;
GROUP BY name
HAVING COUNT(*) > 1;
Notes:
- The
WHERE
clause goes immediately after theFROM
clause. The ordering of clauses is important. - Column aliases cannot have spaces unless you wrap them in escape characters. Just use an underscore.
- Although
count(name)
is fine,count(*)
is more convenient for just counting rows.
As for your question: The aggregation functions only return values based on rows that match the group. If you wanted overall numbers, you could use window functions in combination with them:
SELECT name,
COUNT(*) AS ilosc,
MIN(createdDate) as earliest_date,
MAX(createdDate) as latest_date,
SUM(COUNT(*)) OVER () as total_count,
MIN(MIN(createdDate)) OVER () as oeverall_earlest_date,
MAX(MAX(createdDate)) OVER () as oeverall_latest_date
FROM Klienci
WHERE name IS NOT NULL;
GROUP BY name
HAVING COUNT(*) > 1;
Note that the “overall” numbers are only for the rows that are not filtered out by the WHERE
and HAVING
clauses.