是否可以選擇Postgres中的前50行,用select * from yellow_tripdata_staging fetch first 50 rows only
和後按列排序結果?選擇前50行,然後訂購
如果是這樣,怎麼樣?
編輯:表是真的很大,並不是真正重要哪些行我得到。
這個問題是因爲我使用Redash來可視化數據,並且在排序的結果上得到了一些奇怪的順序。然後我意識到我用來排序的列不是數字,而是char,它導致像11和10來前2和3
對不起這個愚蠢的問題
是否可以選擇Postgres中的前50行,用select * from yellow_tripdata_staging fetch first 50 rows only
和後按列排序結果?選擇前50行,然後訂購
如果是這樣,怎麼樣?
編輯:表是真的很大,並不是真正重要哪些行我得到。
這個問題是因爲我使用Redash來可視化數據,並且在排序的結果上得到了一些奇怪的順序。然後我意識到我用來排序的列不是數字,而是char,它導致像11和10來前2和3
對不起這個愚蠢的問題
這不是完全清楚怎麼你前50行被確定以什麼順序作退回。關係數據庫的表中沒有「自然順序」。沒有明確的保證ORDER BY
。
但是,那裏是您可以(ab-)使用的行的當前物理順序。默認情況下,這是行插入的順序 - 只要該表沒有發生任何其他事情。但RDBMS隨時可以隨時更改物理順序,因此物理順序不可靠。結果可以並且將隨着對錶格的寫入操作而改變(包括VACUUM
或其他實用程序命令)。
讓我們打電話給您的第列用於排序後50行sort_col
。
( -- parentheses required
TABLE yellow_tripdata_staging LIMIT 50
)
UNION ALL
( -- parentheses required
SELECT *
FROM (TABLE yellow_tripdata_staging OFFSET 50) sub
ORDER BY sort_col
);
更多解釋(含TABLE
和括號內):
或者,假定sort_col
定義NOT NULL
:
SELECT *
FROM yellow_tripdata_staging
ORDER BY CASE WHEN row_number() OVER() > 50 THEN sort_col END NULLS FIRST;
窗函數row_number()
被允許出現在ORDER BY
子句。
row_number() OVER()
(帶有空的OVER
子句)將根據當前的行物理順序附加序列號 - 上述所有免責聲明仍適用。
CASE
表達式用NULL替換前50行號,由於連接了NULLS FIRST
而首先排序。實際上,前50行是未排序的,其餘排序爲sort_col
。
或者,如果你實際上意味着根據sort_col
採取的第一個50行,讓他們未排序的,而剩下的就是進行排序:
或者,如果您只是想根據當前的物理順序或其他未公開的(更可靠)標準獲取「第一個」行,您需要子查詢或CTE來對外部的這些50行進行排序SELECT
:
SELECT *
FROM (TABLE yellow_tripdata_staging LIMIT 50) sub
ORDER BY sort_col;
您需要明確定義您的要求。
您可以通過兩種不同的列訂購。例如:
select yts.*
from (select yts.*,
row_number() over (order by id) as seqnum
from yellow_tripdata_staging yts
) yts
order by (seqnum <= 50)::int desc,
(case when seqnum <= 50 then id end),
col
在SQL表或無序結果集中沒有「前50行」。您需要更具體地瞭解您想要完成的任務。 –
哦,是的,這正如你剛纔所說的「僅僅是根據目前的物理順序來獲取」第一「50行」我忘了這個問題 –