不完全清楚您的前 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行,不排序,剩下的要排序:
SELECT *
FROM yellow_tripdata_staging
ORDER BY GREATEST (row_number() OVER (ORDER BY sort_col), 50);
或者,如果您只是想根据当前物理顺序或其他一些未公开(更可靠)的标准获取“前”50 行,您需要一个子查询或 CTE 对外部 SELECT 中的这 50 行进行排序:
SELECT *
FROM (TABLE yellow_tripdata_staging LIMIT 50) sub
ORDER BY sort_col;
您需要清楚地定义您的要求。