I have a table ADS in snowflake like so (data is being inserted each day), note there are duplicates entries on rows 3 and 4:
| ID | REPORT_DATE | CLICKS | IMPRESSIONS |
|---|---|---|---|
| 1 | Jan 01 | 20 | 400 |
| 1 | Jan 02 | 25 | 600 |
| 1 | Jan 03 | 80 | 900 |
| 1 | Jan 03 | 80 | 900 |
| 2 | Jan 01 | 30 | 500 |
| 2 | Jan 02 | 55 | 650 |
| 2 | Jan 03 | 90 | 950 |
I want to select all entries based on ID with the max REPORT_DATE - essentially I want to know the latest number of CLICKS and IMPRESSIONS for each ID:
| ID | REPORT_DATE | CLICKS | IMPRESSIONS |
|---|---|---|---|
| 1 | Jan 03 | 80 | 900 |
| 2 | Jan 03 | 90 | 950 |
This query successfully gives me the max DATE for each ID:
SELECT
MAX(REPORT_DATE),
ID
FROM ADS
GROUP BY
ID;
Result:
| ID | MAX(REPORT_DATE) |
|---|---|
| 1 | Jan 03 |
| 2 | Jan 03 |
However, when I try to conduct an inner join, duplicates arise:
SELECT
a.ID,
a.REPORT_DATE,
a.CLICKS,
a.IMPRESSIONS
FROM ADS a
INNER JOIN (
SELECT
MAX(REPORT_DATE),
ID
FROM ADS
GROUP BY
ID
) b
ON a.ID = b.ID
AND a.REPORT_DATE = b.REPORT_DATE;
Result:
| ID | REPORT_DATE | CLICKS | IMPRESSIONS |
|---|---|---|---|
| 1 | Jan 03 | 80 | 900 |
| 1 | Jan 03 | 80 | 900 |
| 2 | Jan 03 | 90 | 950 |
How can I construct my query to remove these duplicates?