2017-08-16 109 views
0

是否可以選擇Postgres中的前50行,用select * from yellow_tripdata_staging fetch first 50 rows only按列排序結果?選擇前50行,然後訂購

如果是這樣,怎麼樣?

編輯:表是真的很大,並不是真正重要哪些行我得到。

這個問題是因爲我使用Redash來可視化數據,並且在排序的結果上得到了一些奇怪的順序。然後我意識到我用來排序的列不是數字,而是char,它導致像11和10來前2和3

對不起這個愚蠢的問題

+4

在SQL表或無序結果集中沒有「前50行」。您需要更具體地瞭解您想要完成的任務。 –

+0

哦,是的,這正如你剛纔所說的「僅僅是根據目前的物理順序來獲取」第一「50行」我忘了這個問題 –

回答

1

這不是完全清楚怎麼你前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; 

您需要明確定義您的要求。

0

您可以通過兩種不同的訂購。例如:

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