选择前50行然后订购

时间:2017-08-16 21:57:55

标签: sql postgresql sql-order-by sql-limit

是否可以选择Postgres中使用select * from yellow_tripdata_staging fetch first 50 rows only的前50行和之后的按行对结果进行排序?

若然,怎么样?

编辑:表格非常大,并且我得到的行数并不重要。

这个问题是因为我使用Redash来显示数据并且在排序结果上得到了一些奇怪的顺序。然后我意识到我用来订购的列不是数字而是char,这会导致11和10之类的值来到2和3之前。

对不起这个愚蠢的问题

2 个答案:

答案 0 :(得分: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表达式将前50个行号替换为NULL,首先由于附加NULLS FIRST而排序。实际上,前50行未分类,其余按sort_col排序。

,如果您实际上是指根据sort_col获取前50行并将其保留为未排序,而其余部分将进行排序:< / p>

SELECT *
FROM   yellow_tripdata_staging
ORDER  BY GREATEST (row_number() OVER (ORDER BY sort_col), 50);

,如果您只想获取&#34;首先&#34;根据当前物理顺序或其他一些未公开(更可靠)标准的50行,您需要子查询或CTE来对外部SELECT中的那50行进行排序:

SELECT *
FROM  (TABLE yellow_tripdata_staging LIMIT 50) sub
ORDER  BY sort_col;

您需要清楚地定义您的要求。

答案 1 :(得分: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