輸入表:
| 序列 | ID |
|---|---|
| 1 | 一個 |
| 2 | 一個 |
| 3 | 乙 |
| 4 | 乙 |
| 5 | 一個 |
| 7 | C |
預期輸出:
| 序列 | ID | 秩 |
|---|---|---|
| 1 | 一個 | 1 |
| 2 | 一個 | 1 |
| 3 | 乙 | 2 |
| 4 | 乙 | 2 |
| 5 | 一個 | 3 |
| 7 | C | 4 |
我試過了,rank() OVER(PARTITION BY id)但只給了我:
| 序列 | ID | 秩 |
|---|---|---|
| 1 | 一個 | 1 |
| 2 | 一個 | 1 |
| 3 | 乙 | 1 |
| 4 | 乙 | 1 |
| 5 | 一個 | 1 |
| 7 | C | 1 |
我能怎么做 ?我沒有找到 row_number 或其他視窗函式
uj5u.com熱心網友回復:
您可以按照以下兩個步驟來解決您的問題:
- 當“ id ”改變時定義一個布林值,對“ seq ”欄位的行進行排序
- 計算此標志的運行總和,顯示 id 何時更改
WITH cte AS (
SELECT *, CASE WHEN id <> LAG(id) OVER(ORDER BY seq)
THEN 1
ELSE 0
END AS id_change
FROM tab
)
SELECT seq,
id,
SUM(id_change) OVER(ORDER BY seq) 1 AS rn
FROM cte
我們添加 1到排名是因為第一次遇到的“ id ”相對于之前的值沒有“改變”,但我們仍然希望將它包含在排名中,因此每個值都會移動,就像預期的輸出一樣。
在此處查看演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/498453.html
標籤:sql PostgreSQL
下一篇:SQL函式到貨幣轉換
