row_number () более (разделить на ____ порядка на ____), но только когда даты истекли определенное количество времени - PullRequest
0 голосов
/ 30 октября 2019

У меня есть «ранг пакета», основанный на определенном количестве раз, когда уникальный идентификатор клиента отправлял пакет.

row_number() over (partition by package.customer_id 
                   order by ship_date.shipped_date) as package_rank

Возвращенный результат выглядит примерно так:

+------------+-----------+-----+
|customer_id | ship_date | rank|
+------------+-----------+-----+
| sam        | 8/20/2019 |  1  |
| sam        | 9/20/2019 |  2  |
| sam        | 9/23/2019 |  3  | 
| tim        | 9/20/2019 |  1  |
| tim        | 10/18/2019|  2  |
+------------+-----------+-----+

Поскольку маловероятно, что мы отправили бы еще одну полную коробку в течение 3 дней, как в случае с Сэмом, я бы не хотел включать эту поставку. Я бы хотел, чтобы в ранг были включены даты отгрузки, которые как минимум на 28 дней позже предыдущей даты отгрузки. Пожалуйста, дайте мне знать, как лучше всего это сделать! Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Используйте lag(), чтобы получить предыдущую дату отгрузки. Затем фильтр на основе этого. Я бы сказал это так:

SELECT customer_id, ship_date,
       ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY ship_date) AS package_rank
FROM (SELECT p.*,
             LAG(ship_date) OVER (PARTITION BY customer_id ORDER BY ship_date) AS prev_ship_date
      FROM package p
     ) p
WHERE prev_ship_date IS NULL OR
      prev_ship_date < ship_date - INTERVAL '28 day'
ORDER BY rank;
1 голос
/ 30 октября 2019

Используйте оконную функцию для исключения таких строк из списка:

SELECT customer_id,
       ship_date,
       row_number()
           OVER (PARTITION BY customer_id
                 ORDER BY ship_date) AS rank
FROM (SELECT customer_id,
             ship_date,
             lag(ship_date)
                OVER (PARTITION BY customer_id
                      ORDER BY ship_date) AS prev_ship_date
       FROM package) AS p1
WHERE (prev_ship_date + 28 > ship_date) IS NOT FALSE
ORDER BY rank;
...