有沒有辦法像 with 一樣限制選擇LIMIT,但不是用偏移量回傳限制,而是用“傳播”限制。
因此,例如,如果一個選擇回傳 1000 行并且我將其限制為 100,那么我會從開始到結束每 10 行。
我知道這需要執行完整SELECT操作,因為 RDBMS 需要遍歷所有行才能執行此操作。但是,例如,當我需要每 100 行時回傳 100000 行,傳輸會減少很多,并且作業可以在 RDBMS 上完成。
我在 PostgreSQL 資料庫上需要這個。
uj5u.com熱心網友回復:
沒有與LIMIT/OFFSET(也沒有與標準 SQL FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES }])相關的內置語法來做到這一點。
您可以使用模運算子%實作您的目標:
SELECT *
FROM (
SELECT row_number() OVER () AS rn, ... original SELECT list
FROM ... -- original query
) sub
WHERE rn%10 = 0 -- every 10th row
由于ORDER BY視窗定義中沒有,所以根據ORDER BY查詢的分配行號。
如果根本沒有 ORDER BY,您將獲得任意的行順序。那還是某種秩序,結果就在你的掌握之中。
您可以應用一種過濾器上的單個表與TABLESAMPLE語法。
SELECT * FROM tbl TABLESAMPLE SYSTEM (10); -- roughly 10 %
或者:
SELECT * FROM tbl TABLESAMPLE BERNOULLI (10); -- roughly 10 %
SYSTEM更快,BERNOULLI更隨機。
您甚至可以對TABLESAMPLE同一查詢中的多個表應用過濾器,例如:
SELECT *
FROM tbl1 TABLESAMPLE SYSTEM (10)
JOIN tbl2 TABLESAMPLE BERNOULLI (10) USING (big_id);
但結果行的數量可能會有很大差異。要獲得給定的行數,請考慮使用附加模塊tsm_system_rows。看:
- 在 PostgreSQL 中發現表的行數的快速方法
- 選擇隨機行的最佳方法 PostgreSQL
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/384916.html
標籤:sql PostgreSQL的 sqlalchemy sql限制
下一篇:具有隱藏列值的資料框
