我有一個名為 wbs_numbers 的子表。主鍵id是ltree
一個典型的例子是
| ID | series_id |
|---|---|
| abc.xyz.00001 | 1 |
| abc.xyz.00002 | 1 |
| abc.xyz.00003 | 1 |
| abc.xyz.00101 | 1 |
所以父表稱為系列。它有一個名為last_contigous_max.
給定上面的例子,我希望 id 1 的系列的最后一個連續最大值為 3
總是可以假設 wbs 的 ltree 總是 3 個片段,以點分隔。最后一個片段始終是一個 5 位數字字串,左填充零。總是可以假設第一個孩子總是以,00001并且理論上一個系列的孩子總數永遠不會超過 9999。
如果您將其視為間隙和孤島,則 wbs_numbers 永遠不會以系列中的間隙開頭。它總是從一個島嶼開始。
意思是說這是不可能的。
| ID | series_id |
|---|---|
| abc.xyz.00010 | 1 |
| abc.xyz.00011 | 1 |
| abc.xyz.00012 | 1 |
| abc.xyz.00101 | 1 |
這個有可能
| ID | series_id |
|---|---|
| abc.xyz.00001 | 1 |
| abc.xyz.00004 | 1 |
| abc.xyz.00005 | 1 |
| abc.xyz.00051 | 1 |
| abc.xyz.00052 | 1 |
| abc.xyz.00100 | 1 |
| abc.xyz.10001 | 2 |
| abc.xyz.10002 | 2 |
| abc.xyz.10003 | 2 |
| abc.xyz.10051 | 2 |
| abc.xyz.10052 | 2 |
| abc.xyz.10100 | 2 |
| abc.xyz.20001 | 3 |
| abc.xyz.20002 | 3 |
| abc.xyz.20003 | 3 |
| abc.xyz.20004 | 3 |
| abc.xyz.20052 | 3 |
| abc.xyz.20100 | 3 |
所以在這種情況下,最后一個連續的最大值是
- 對于系列 ID 1 => 1
- 對于系列 id 2 => 3
- 對于系列 ID 3 => 4
last_contigous_max計算任何給定 series_id的數字的查詢是什么?
我也不介意有另一張桌子來存放“島嶼”。
此外,您可以放心地假設 wbs_number 記錄一旦創建就永遠不會被洗掉。表格中id的也永遠不會更改。wbs_numbers
意思是說島嶼只會增長,不會縮小。
uj5u.com熱心網友回復:
您可以按照以下步驟解決您的問題:
- 從“ id ”欄位中提取整數值
- 根據您的 id 值計算排名值
- 當您的排名值與您的 id 值不匹配時過濾掉
- 在每場比賽的最后一行打成平手
WITH cte AS (
SELECT *, CAST(RIGHT(id_, 4) AS INTEGER) AS idval
FROM tab
), ranked AS (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY series_id ORDER BY idval) AS rn
FROM cte
)
SELECT series_id, idval
FROM ranked
WHERE idval = rn
ORDER BY ROW_NUMBER() OVER(PARTITION BY series_id ORDER BY idval DESC)
FETCH FIRST ROWS WITH TIES
在此處查看演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/517005.html
