根據一組行的值在一個列上添加值
想像一下像“uber Eats”這樣的東西:
有司機基地(商場),商場外的其他餐廳和顧客位置。
每行是兩點(基礎、餐廳_# 和客戶#)之間的行程:可以有 3 行的服務(基礎-餐廳-客戶-基礎),其他的有 2 行(基礎-客戶-基礎),其他的多一點。 …(錯誤的順序:))燃油停止。
需要為每個服務聚合列中適用於該服務的行,例如 service_numb ,其序列號從每個月開始,月份為 1/月、2/月、3/月。
有一欄:
- Base,其中“OUT”和“IN”表示離開基地和返回基地,所以這應該是新服務的觸發器。
- 日期線,用於排序/訂單
- 購物車,用於辨識送貨車,在許多
這只會執行一次以填充該列,而不是手動執行。
在postgresSQL 13.6中可能 嗎?
編輯:
用一張桌子:
需要創建一個包含服務編號、年/月和按購物車的附加列,例如:
編輯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
;- 列舉 OUT/IN 序列的表達式。
什麼都不需要做
cart
,你只需在最終的連接表達式中使用它。關於格式化的月份,您可以將其獲取為
to_char(datetime, 'YYYYMM')
至於序列號,你的
SUM
表達是一個好的開始。您需要另外按月進行分區,以便每月重置數字。您可以使用上面的月份表達式作為第二個分區標準:SUM(CASE WHEN base='OUT' THEN 1 END) OVER (PARTITION BY cart, to_char(datetime, 'YYYYMM') ORDER BY datetime)
或者您可以改用該
date_trunc
函式,它可能會或可能不會更快:SUM(CASE WHEN base='OUT' THEN 1 END) OVER (PARTITION BY cart, date_trunc('month', datetime) ORDER BY datetime)
現在涵蓋了所有組件,您只需要將它們連接成一個
service_num
值:SELECT * , cart || '/' || to_char(datetime, 'YYYYMM') || '/' || SUM(CASE WHEN base='OUT' THEN 1 END) OVER (PARTITION BY cart, date_trunc('month', datetime) ORDER BY datetime) AS service_num FROM YourTable ORDER BY datetime ;