質問

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

SELECT TOP n WITH TIES FROM tablename
.

PostgreSQLでLIMITについて知っていますが、上記の相当量は存在しますか?私のために毎回追加のクエリを節約するので興味があります。

属性Numbersを持つテーブルnumsを持っている場合:{10, 9, 8, 8, 2}のようなことをしたいです。

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

{10, 9, 8, 8}を返すはずです。

役に立ちましたか?

解決

There is no WITH TIES clause in PostgreSQL like there is in SQL Server.
In PostgreSQL I would substitute this for 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;

To be clear, rank() is right, dense_rank() would be wrong (return too many rows).
Consider this quote from the SQL Server docs (from the link above):

For example, if expression is set to 5 but 2 additional rows match the values of the ORDER BY columns in row 5, the result set will contain 7 rows.

The job of WITH TIES is to include all peers of the last row in the top n as defined by the ORDER BY clause. rank() gives the exact same result.

To make sure, I tested with SQL server, here is a live demo.
And here is a more convenient SQLfiddle.

他のヒント

Try this:

Output: 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

Output: 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top