У меня есть данные в следующем формате
id | first_name | last_name | birth_date
abc | Jared | Pollard | 1970-01-01
def | Jared | Pollard | 1972-02-02
ghi | Jared | Pollard | 1980-01-01
klm | Jared | Pollard | 2015-01-01
, и я хотел бы запрос, который группирует данные на основе следующего правила
Если first_name, last_name равны, и birth_datesнаходятся в пределах 5 лет друг от друга, чем записи принадлежат одной и той же группе
Таким образом, приведенные выше данные содержат три группы: group1 = (abc, def), group2 = (ghi) и group3 = (klm)
В настоящее время у меня есть следующий запрос, который неправильно создает только 2 группы, group1 = (abc, def) и group2 = (ghi, klm)
SELECT
g.id,
FIRST_VALUE(g.id) OVER (PARTITION BY lower(trim(g.last_name)), lower(trim(g.first_name)),
CASE WHEN g.birth_date between g.fv_birth_date - interval '5 year' AND g.fv_birth_date + interval '5 year' THEN 1 ELSE 0 END
ORDER BY g.last_used_dt DESC NULLS LAST) AS cluster_id
FROM (
SELECT id, last_used_dt, last_name, first_name, birth_date,
FIRST_VALUE(birth_date)
OVER (PARTITION BY
lower(trim(last_name)),
lower(trim(first_name))
ORDER BY last_used_dt DESC NULLS LAST) AS fv_birth_date
FROM guest
) g;
Я понимаю, что это из-за CASEоператор в предложении PARTITION BY, но я не могу найти другой запрос