Это сложнее, чем вы думаете, из-за високосных лет. Предполагая, что дубликатов нет, вы можете использовать арифметику даты:
SELECT native_id, EXTRACT(year FROM datestamp) as yyyy
FROM TABLE
GROUP BY native_id, yyyy
HAVING COUNT(*) = MAKE_DATE(EXTRACT(year FROM datestamp)::int + 1, 1, 1) - MAKE_DATE(EXTRACT(year FROM datestamp)::int, 1, 1);
Если есть дубликаты, используйте COUNT(DISTINCT)
. Однако это более дорого с точки зрения производительности, поэтому не используйте DISTINCT
, если не нужно.
Затем вы можете получить исходные данные, выполнив:
SELECT t.*
FROM table t
WHERE (native_id, EXTRACT(year FROM datestamp)::int) IN
(SELECT native_id, EXTRACT(year FROM datestamp)::int as yyyy
FROM TABLE
GROUP BY native_id, yyyy
HAVING COUNT(*) = MAKE_DATE(EXTRACT(year FROM datestamp)::int + 1, 1, 1) - MAKE_DATE(EXTRACT(year FROM datestamp)::int, 1, 1)
);