我有一个基于特定次数的“包排名”,一个唯一的客户id已经被发送了一个包。
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天。请让我知道最好的方法是什么!提前谢谢你。
发布于 2019-10-31 02:30:06
使用窗口函数从列表中排除以下行:
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;
发布于 2019-10-31 04:16:12
使用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;
https://stackoverflow.com/questions/58631440
复制相似问题