10

私はSQLServerでこれに似たものを探しています:

SELECT TOP n WITH TIES FROM tablename

LIMITPostgreSQLで知っていますが、上記に相当するものはありますか?毎回余分なクエリを節約できるので、興味があります。

Numbers属性を持つテーブルがある場合nums{10, 9, 8, 8, 2}。私は次のようなことをしたい:

SELECT nums FROM Numbers ORDER BY nums DESC LIMIT *with ties* 3

{10, 9, 8, 8}トップ3に加えて、もう1つを結ぶため、余分なものが必要になるため、戻る必要があり8ます。

4

3 に答える 3

15

Postgres13はついにを追加しますWITH TIES。見る:


SQL Serverのように、PostgreSQL12までの句はありませんWITH TIES。 PostgreSQLではこれを次の代わりに使用します:
TOP n WITH TIES .. ORDER BY <something>

WITH cte AS (
   SELECT *, rank() OVER (ORDER BY <something>) AS rnk
   FROM   tbl
   )
SELECT *
FROM   cte
WHERE  rnk <= n;

明確にするために、rank()正しい、dense_rank()間違っているでしょう(あまりにも多くの行を返します)。
SQL Serverのドキュメント(上記のリンクから)からのこの引用を検討してください。

たとえば、式が5に設定されているが、追加の2行が行5のORDER BY列の値と一致する場合、結果セットには7行が含まれます。

の仕事は、句で定義されているようWITH TIESに、最後の行のすべてのピアを上位nに含めることです。まったく同じ結果が得られます。ORDER BYrank()

念のため、SQLServerでテストしました。これがライブデモです。

ここでdb<>フィドル

Postgres 12以前の大きなテーブルのより高速な代替手段:

于 2012-03-09T07:44:07.493 に答える
2

これを試して:

出力:10、9、8、8

with numbers (nums) as (
  values (10), (9), (8), (8), (2)
) 
SELECT nums FROM Numbers 
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3)
ORDER BY nums DESC

出力:10、10、9、8、8

with numbers (nums) as (
  values (10), (9), (8), (8), (2), (10)
) 
SELECT nums FROM Numbers 
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3)
ORDER BY nums DESC
于 2012-03-09T07:56:14.010 に答える
2

PostgreSQLはすでにOFFEST FETCH句をサポートしており、バージョン13以降は以下をサポートしFETCH FIRST WITH TIESます。

選択する

[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES } ]

WITH TIESオプションは、ORDER BY句に従って、結果セットの最後の場所に関連する追加の行を返すために使用されます。この場合、ORDERBYは必須です。

クエリ:

SELECT nums 
FROM Numbers 
ORDER BY nums DESC
FETCH NEXT 3 ROWS WITH TIES;

db<>フィドルデモ

于 2020-05-23T09:21:31.050 に答える