我試圖理解 Postgres 中的視窗函式,但我不明白。這是一個例子。只是試圖獲取受 where 子句限制的記錄集的最后一個值:
tid | pid | position | recorded | uvalue | cvalue | record_id
----- ----- ---------- --------------------- -------- -------- -----------
10 | 2 | 100 | 2022-02-01 12:00:00 | 270 | 270 | 102
10 | 2 | 100 | 2022-03-15 12:00:00 | 270 | 254 | 102
10 | 2 | 100 | 2022-11-17 12:00:00 | 270 | | 102
10 | 2 | 100 | 2022-12-01 14:00:00 | 270 | | 102
10 | 2 | 100 | 2023-02-03 11:00:00 | 270 | | 102
10 | 2 | 100 | 2023-03-01 04:00:00 | 270 | | 102
10 | 2 | 100 | 2023-04-01 04:00:00 | 270 | 251 | 102
這就是查詢
select last_value(cvalue) over (order by recorded)
from data
where recorded < '2022-11-17 12:00:00';
結果是
last_value
------------
270
254
(2 rows)
應該是254吧?
uj5u.com熱心網友回復:
WHERE視窗函式為子句選擇的每一行計算一個結果。
在您的示例中,有兩行,recorded < '2022-11-17 12:00:00'因此在最終結果中得到兩行是正常的。
OVER()然后通過默認情況下等效于的子句為每一行計算視窗OVER(ROWS BETWEEN UNBOUDED PRECEDING AND CURRENT ROW)。因此,您再次獲得270與查詢子句254對齊的結果行也是正常的。over (order by recorded)
您應該仔細閱讀手冊§3.5和§4.2.8。
如果您只想要一個結果行,那么您可以執行以下操作:
select cvalue
from data
where recorded < '2022-11-17 12:00:00'
order by recorded DESC
limit 1
或者您可以使用聚合函式:
select (array_agg(cvalue ORDER BY recorded DESC))[1]
from data
where recorded < '2022-11-17 12:00:00'
在dbfiddle中查看測驗結果
uj5u.com熱心網友回復:
這是記錄在案的行為
請注意,first_value、last_value 和 nth_value 僅考慮“視窗框架”內的行,默認情況下包含從磁區開始到當前行的最后一個對等方的行
https://www.postgresql.org/docs/14/functions-window.html
如果您希望其他框架明確指定它,例如
with cte as (
select last_value(cvalue) over (order by recorded
rows between unbounded preceding and unbounded following) as lv
from data
)
select *
from cte
where recorded < '2022-11-17 12:00:00';
uj5u.com熱心網友回復:
last_value將在應用 where 子句后對每一行執行。where 子句匹配兩行,因此您在結果中得到兩行。
您的查詢預期結果可以通過使用order bywith獲得offset fetch:
select cvalue
from t
where recorded < '2022-11-17 12:00:00'
order by recorded desc
offset 0 rows
fetch first 1 row only
uj5u.com熱心網友回復:
因為last_value視窗函式會在之后的每一行回傳最新的值where
在您的情況下,適合使用first_value視窗函式,order by recorded desc它可能會根據您的情況回傳最新cvalue的。
select first_value(cvalue) over (order by recorded desc)
from t
where recorded < '2022-11-17 12:00:00'
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/439755.html
標籤:sql PostgreSQL
上一篇:在MS串列中,有沒有辦法顯示對啟用了“將更改附加到現有文本”的列的最新更新?
下一篇:如何將天轉換為分鐘
