首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >row_number() (Partition by ____ order by____),但仅当日期经过一定时间时

row_number() (Partition by ____ order by____),但仅当日期经过一定时间时
EN

Stack Overflow用户
提问于 2019-10-31 02:13:16
回答 2查看 114关注 0票数 0

我有一个基于特定次数的“包排名”,一个唯一的客户id已经被发送了一个包。

代码语言:javascript
运行
复制
row_number() over (partition by package.customer_id 
                   order by ship_date.shipped_date) as package_rank

返回的输出如下所示:

代码语言:javascript
运行
复制
+------------+-----------+-----+
|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天。请让我知道最好的方法是什么!提前谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-31 02:30:06

使用窗口函数从列表中排除以下行:

代码语言:javascript
运行
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2019-10-31 04:16:12

使用lag()获取以前的发货日期。然后基于此进行过滤。我把这句话说成:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58631440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档