Postgresql

根據一組行的值在一個列上添加值

  • August 24, 2022

想像一下像“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
;

引用自:https://dba.stackexchange.com/questions/315911