Select 前 50 行然后排序
Select first 50 rows then order
是否可以 select 在 Postgres 中使用 select * from yellow_tripdata_staging fetch first 50 rows only
和 after 按列对结果进行排序的前 50 行?
如果是,怎么做?
编辑:table 确实很大,我得到哪一行并不重要。
这个问题是因为我使用 Redash 来可视化数据并且在排序后得到了一些奇怪的顺序 results.then 我意识到我用来排序的列不是数字而是 char,这导致值比如 11 和 10 排在 2 和 3 之前。
我很抱歉这个愚蠢的问题
您可以按两个不同列排序。例如:
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
目前还不完全清楚您的前 50 行 是如何被识别的以及它们将按什么顺序返回。关系数据库的table中没有"natural order"。没有明确的 ORDER BY
.
就没有保证
但是,是您可以(滥用)使用的当前物理行顺序。默认情况下,这是插入行的顺序 - 只要没有其他事情发生 table。但是RDBMS可以随时随意改变物理顺序,所以物理顺序是不可靠的。结果可以并且将会随着对 table(包括 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;
window函数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);
或,如果你只是想根据当前物理顺序或其他一些未公开的顺序获取"first" 50行(更可靠)标准,您需要一个子查询或 CTE 来对外部 SELECT
:
中的那 50 行进行排序
SELECT *
FROM (TABLE yellow_tripdata_staging LIMIT 50) sub
ORDER BY sort_col;
您需要清楚地定义您的需求。
是否可以 select 在 Postgres 中使用 select * from yellow_tripdata_staging fetch first 50 rows only
和 after 按列对结果进行排序的前 50 行?
如果是,怎么做?
编辑:table 确实很大,我得到哪一行并不重要。
这个问题是因为我使用 Redash 来可视化数据并且在排序后得到了一些奇怪的顺序 results.then 我意识到我用来排序的列不是数字而是 char,这导致值比如 11 和 10 排在 2 和 3 之前。
我很抱歉这个愚蠢的问题
您可以按两个不同列排序。例如:
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
目前还不完全清楚您的前 50 行 是如何被识别的以及它们将按什么顺序返回。关系数据库的table中没有"natural order"。没有明确的 ORDER BY
.
但是,是您可以(滥用)使用的当前物理行顺序。默认情况下,这是插入行的顺序 - 只要没有其他事情发生 table。但是RDBMS可以随时随意改变物理顺序,所以物理顺序是不可靠的。结果可以并且将会随着对 table(包括 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;
window函数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);
或,如果你只是想根据当前物理顺序或其他一些未公开的顺序获取"first" 50行(更可靠)标准,您需要一个子查询或 CTE 来对外部 SELECT
:
SELECT *
FROM (TABLE yellow_tripdata_staging LIMIT 50) sub
ORDER BY sort_col;
您需要清楚地定义您的需求。