postgresql 选择前50行,然后排序

vdgimpew  于 2023-04-05  发布在  PostgreSQL
关注(0)|答案(2)|浏览(212)

是否可以选择Postgres中的前50行,其中select * from yellow_tripdata_staging fetch first 50 rows onlyafter按列对结果进行排序?
如果是,如何做到?
编辑:表真的很大,我得到哪些行并不重要。
这个问题是因为我使用Redash来可视化数据,并且在排序结果上得到了一些奇怪的顺序。然后我意识到我用来排序的列不是数字而是char,这导致像11和10这样的值出现在2和3之前。
我很抱歉这个愚蠢的问题

gopyfrb3

gopyfrb31#

目前还不完全清楚你的“前50行”是如何识别的,以及它们应该以什么顺序返回。在关系数据库的表中没有“自然顺序”。没有明确的ORDER BY就没有保证。
但是,您可以使用***行的当前物理顺序(ab-)use。通常,这是插入行的顺序-只要该表没有发生任何其他情况。但RDBMS可以随时自由更改物理顺序,所以物理顺序是不可靠的。结果可以并且将随着对表的写操作(包括VACUUM或其他实用程序命令)而改变。
我们将排序列命名为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和括号):

  • SELECT * FROM有快捷方式吗?
  • 得到n个分组的类别,并将其他类别相加为一
    ,假设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行,并保持它们不排序,而其余的是排序:

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;

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

brjng4g3

brjng4g32#

您可以按两个 * 不同 * 列排序。例如:

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

相关问题