我有一張看起來像這樣的桌子:
| GR | 一世 | 馮 | 國際清算銀行 |
|---|---|---|---|
| 1 | 一種 | 1 | 2 |
| 2 | b | 2 | 3 |
| 1 | C | 3 | 4 |
| 1 | d | 4 | 5 |
| 3 | e | 5 | 6 |
“GR”列是我要用于分組的資訊。
“I”列包含一些不重要的資訊。
“VON”列最初保存一個日期值——為了便于閱讀,我在這里使用了一個數字。
“BIS”列也是如此。
因此,記錄包含一些對“VON”和“BIS”指定的間隔有效的資訊,應按“GR”分組。
我正在嘗試構建一個查詢以獲得如下結果:
| GR | 一世 | 馮 | 國際清算銀行 |
|---|---|---|---|
| 1 | 一種 | 1 | 2 |
| 2 | b | 2 | 3 |
| 1 | C | 3 | 5 |
| 3 | e | 5 | 6 |
這意味著,我想合并具有相同分組資訊的行 - 在示例中通過合并記錄 3 和 4。
我想出的是這個查詢 - 但這僅適用于不同的組:
select distinct gr
,first_value(i) over(partition by gr order by von asc) i
,first_value(von) over(partition by gr order by von asc) von
,first_value(bis) over(partition by gr order by von desc) bis
from table_test
;
使用我們的測驗資料會導致這個結果,這顯然是錯誤的:
| GR | 一世 | 馮 | 國際清算銀行 |
|---|---|---|---|
| 1 | 一種 | 1 | 5 |
| 2 | b | 2 | 3 |
| 3 | e | 5 | 6 |
任何想法如何通過查詢來解決這個問題?(我知道我可以用 PL/SQL 做到這一點,但它必須是純 SQL ......)
uj5u.com熱心網友回復:
從 Oracle 12 開始,您可以使用MATCH_RECOGNIZE來執行逐行處理:
SELECT *
FROM table_test
MATCH_RECOGNIZE(
ORDER BY von
MEASURES
FIRST(gr) AS gr,
FIRST(i) AS i,
FIRST(von) AS von,
LAST(bis) AS bis
PATTERN (same_gr )
DEFINE same_gr AS FIRST(gr) = gr
)
其中,對于您的示例資料:
CREATE TABLE table_test (GR, I, VON, BIS) AS
SELECT 1, 'a', 1, 2 FROM DUAL UNION ALL
SELECT 2, 'b', 2, 3 FROM DUAL UNION ALL
SELECT 1, 'c', 3, 4 FROM DUAL UNION ALL
SELECT 1, 'd', 4, 5 FROM DUAL UNION ALL
SELECT 3, 'e', 5, 6 FROM DUAL;
輸出:
GR 一世 馮 國際清算銀行 1 一種 1 2 2 b 2 3 1 C 3 5 3 e 5 6
db<>在這里擺弄
uj5u.com熱心網友回復:
如果您不使用 Oracle 12c 及更高版本,也可以嘗試以下解決方案。
- 我在第一個行內視圖“t”中構建了一個有用的行內冒號“間隙”。
- 然后,在外部行內視圖“tt”中,我基于之前的“間隙”列構建了另一個行內列“group_id”。該欄的目的是填補“空白”欄的空白。
- 最后,在應用 min()keep() 子句以獲得所需的輸出之前,我將所有行按“GR”和“group_id”列分組
SELECT GR
, MIN(I)KEEP(dense_rank FIRST ORDER BY VON ASC) AS I
, MIN(VON)KEEP(dense_rank FIRST ORDER BY VON ASC) AS VON
, MIN(VON)KEEP(dense_rank LAST ORDER BY VON ASC) AS BIS
FROM (
SELECT GR, I, VON, BIS, last_value( GAPS IGNORE NULLS )OVER( ORDER BY von ) group_id
FROM (
select t.*
, CASE WHEN GR != LAG(GR, 1, -GR) OVER ( ORDER BY VON )
THEN ROW_NUMBER()OVER(ORDER BY VON)
ELSE NULL
END AS gaps
from your_tab t
) t
) tt
GROUP BY GR, group_id
ORDER BY VON
;
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/472552.html
上一篇:Oracle資料庫中的DISTINCT、SUBSTR和MAX
下一篇:按條件連接表
