Делайте разделы на основе разницы в дате в оконной функции Postgres - PullRequest
1 голос
/ 01 октября 2019

У меня есть данные в следующем формате

    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, но я не могу найти другой запрос

...