想象一下像“uber Eats”这样的东西:
有司机基地(商场),商场外的其他餐厅和顾客位置。
每行是两点之间的行程(base、restaurant_# 和 customer #):可以有 3 行的服务(base-restaurant-customer-base),另外 2 行(base-customer-base),其他的多一点。 ...(错误的顺序:))燃油停止。
需要为每个服务在列中聚合适用于该服务的行,例如 service_numb ,其序列号从每个月开始,月份为 1/月、2/月、3/月。
有一栏:
- Base,其中“OUT”和“IN”表示离开基地和返回基地,所以这应该是新服务的触发器。
- 日期线,用于排序/订单
- 购物车,用于识别送货车,在许多
这只会运行一次以填充该列,而不是手动执行。
在postgresSQL 13.6中可能 吗?
编辑:
用一张桌子:
约会时间 | 大车 | 根据 |
---|---|---|
2022 08 23 10:10 | 啊 | 出去 |
2022 08 23 10:20 | 啊 | |
2022 08 23 10:30 | 啊 | 在 |
2022 08 23 10:05 | bb | 出去 |
2022 08 23 10:10 | bb | |
2022 08 23 10:30 | bb | |
2022 08 23 10:35 | bb | 在 |
2022 09 23 10:10 | 啊 | 出去 |
2022 09 23 10:20 | 啊 | |
2022 09 23 10:30 | 啊 | 在 |
需要创建一个包含服务编号、年/月和按购物车的附加列,例如:
约会时间 | 大车 | 根据 | 服务编号 |
---|---|---|---|
2022 08 23 10:10 | 啊 | 出去 | aa/202208/1 |
2022 08 23 10:20 | 啊 | aa/202208/1 | |
2022 08 23 10:30 | 啊 | 在 | aa/202208/1 |
2022 08 23 10:05 | bb | 出去 | bb/202208/1 |
2022 08 23 10:10 | bb | bb/202208/1 | |
2022 08 23 10:30 | bb | bb/202208/1 | |
2022 08 23 10:35 | bb | 在 | bb/202208/1 |
2022 09 23 10:10 | 啊 | 出去 | aa/202209/1 |
2022 09 23 10:20 | 啊 | aa/202209/1 | |
2022 09 23 10:30 | 啊 | 在 | aa/202209/1 |
编辑2:
SELECT *,SUM(CASE WHEN base='OUT' then 1 end) OVER (PARTITION BY cart ORDER BY datetime) AS m1
FROM table
ORDER BY datetime
已经在所有表格中给出了一个序列号,除以购物车。
缺少:添加购物车,yyyy/mm 并每月重新开始编号并按购物车
编辑3:
使用@Andriy M 下面提供的答案,已经在工作,唯一的问题是一条或多条腿“跳”到下个月的情况?
例如:leg1 2022/07/31 23:30 leg2 2022/08/01 00:05 leg3 2022/08/01 00:35
对于相同的 service_number。日期时间已经是时间线,所以没有问题。问题似乎在日期时间的 PARTITION BY 上,以适应新月份的通道。
您的
service_num
值似乎包含由 a 分隔的这三个组件/
:cart
;datetime
格式化为月份的表达式YYYYMM
;什么都不需要做
cart
,你只需在最终的连接表达式中使用它。关于格式化的月份,您可以将其获取为
至于序列号,你的
SUM
表达是一个好的开始。您需要另外按月进行分区,以便每月重置数字。您可以使用上面的月份表达式作为第二个分区标准:或者您可以改用该
date_trunc
函数,它可能会或可能不会更快:现在涵盖了所有组件,您只需要将它们连接成一个
service_num
值: