我有一個表,當ORDERED by R_Value Desc時,看起來是這樣的
需要注意的是,要理解下面的表是SQL SELECT ordered by R_Value
Id Letter R_Value
1 A 1500
2 A 1400
4 B800
9B 700
10B 600
11 A 400
12 A 200
我希望我的結果集看起來像這樣。 該結果集需要被分組3 次。每當字母從A變為B或反之亦然時,就應該形成一個新的組。 形成。
字母 Max_RValue
A1500
B800
A 400
我已經試驗了各種東西--前導/后導函式、磁區等,似乎不可能。一個簡單的Group by(Letter)顯然不能作業,因為
所有的'A'將被放在一個組中,這不是我想要的。
我的下一步將是在程式語言中嘗試這樣做,將其轉儲到一個 我的下一步是在程式語言中進行嘗試,將其轉儲到一個中間表中,然后讀取結果。在這樣做之前,這在普通 SQL 中是否可行? 么可能?
uj5u.com熱心網友回復:
你可以使用LAG()視窗函式來檢查每一行的Letter的前一個值,以及SUM()視窗函式來創建連續出現的行組。
然后在每個組中聚合:
SELECT Letter, MAX(R_Value) Max_RValue
FROM (
SELECT *, SUM(標志:: int) OVER (ORDER BY R_Value DESC) GRP
FROM (
SELECT *, Letter <> LAG(Letter, 1, ''/span>) OVER (ORDER BY R_Value DESC) 標志
FROM tablename
) t
) t
GROUP BY grp, Letter;
或者,更簡單的只是選擇Letter變化的行:
SELECT Letter, R_Value
FROM (
SELECT *, LAG(Letter, 1, ' '/span>) OVER (ORDER BY R_Value DESC) prev_Letter
FROM tablename
) t
WHERE Letter <> prev_Letter;
請看demo.
uj5u.com熱心網友回復:
Forpas的第二個解決方案是可以的,但它可以在Postgres中更簡單地寫成:
select letter, r_value
from (select t。 *, lag(letter) over (order by r_value) as prev_letter
from t
) t
where prev_letter is distinct from letter;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/324754.html
標籤:
