有沒有辦法選擇行,直到滿足一些條件?即一種類型爲limit
,但不限於N
行,而是包含到所有行,直到第一個不匹配的行?選擇直到在postgresql中匹配行嗎?
例如,說我有表:
CREATE TABLE t (id SERIAL PRIMARY KEY, rank INTEGER, value INTEGER);
INSERT INTO t (rank, value) VALUES (1, 1), (2, 1), (2,2),(3,1);
那就是:
test=# SELECT * FROM t;
id | rank | value
----+------+-------
1 | 1 | 1
2 | 2 | 1
3 | 2 | 2
4 | 3 | 1
(4 rows)
我想排名訂貨,並選擇直到第一行是超過1
iee SELECT * FROM t ORDER BY rank UNTIL value>1
我想把第2排放回去?
一種解決方案是使用子查詢和bool_or
:
SELECT * FROM
(SELECT id, rank, value, bool_and(value<2) OVER (order by rank, id) AS ok FROM t ORDER BY rank) t2
WHERE ok=true
但不會是最終通過所有的行會,就算我只想要一把? (真實世界上下文中:我在表格中有時間戳事件,我可以使用窗口查詢超前/滯後來選擇兩個事件之間的時間,我希望now
的所有事件只要發生少於10次就返回除了分鐘 - 在lead/lag
窗口查詢複雜的事情,這裏這麼簡單的例子)
編輯:由rank, id
最小值(或最大值)可以從索引中有效地獲得。 –
這是基本例子的一個巧合,即ID和Rank排序在一起(我固定了上面的查詢),但是你可以用'min(rank)'來達到同樣的效果。我的直覺是,這比我的子查詢更快。 如上所述,真實情況比較複雜,實際上計算的是「值」,並且還有一個額外的過濾器只能獲得表格的某些部分。我會嘗試一下,看看是否有這樣的作品! – gromgull