2012-03-09 8 views
9

私は、SQL Serverでこの同じような何かを探しています:PostgreSQLはTOP n WITH TIESに相当します:LIMIT "with ties"?

SELECT TOP n WITH TIES FROM tablename 

私はおよそLIMIT PostgreSQLのを知っているが、上記が存在相当していますか?私はそれが毎回余分なクエリを保存するので、ちょうど興味があります。

テーブルNumbersの属性がnumsの場合:{10, 9, 8, 8, 2}です。それは他のものを結びつけるので、それはトップ3に加えて、余分な8がかかるため、それは{10, 9, 8, 8}を返すべき

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

:私のような何かをしたいです。

答えて

8

SQL Serverにあるように、PostgreSQLには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()は間違っているだろう、権利です。式5つのが、さらに2行に設定されている場合、例えば

、行5の列、ORDER BYの 値と一致:
(上記のリンクからの)SQL Serverのドキュメントから、この引用を検討結果セットには7 の行が含まれます。

WITH TIESのジョブはORDER BY句によって定義されるように上部Nの最後の行のすべてのピアを含むことです。 rank()は全く同じ結果を返します。

SQLサーバーでテストしたことを確認するため、ここにはlive demoがあります。
さらに便利ですSQLfiddleです。

+1

なぜ、この複雑な? rank()関数は必要なものを正確に実行しますか? –

+0

@a_horse_with_no_name:あなたは絶対に正しいです(最初は私がそうでした)。私の2番目の考慮事項は未だに評価されていませんでした。 –

+0

@Erwin:それはいいです(http://data.stackexchange.com/stackoverflow/query/63525/top-n-with-ties)、私はstackoverflowにクエリを実行する組み込みモジュールがあることを知らなかった:-) 10,9,8,8,2,10の10,10,9の出力は、上位3(10,9,8)を取得して10,9,8をすべてリストする必要がある場合は正しくありませんが、 10,10,9,8,8でなければなりません。 'WITH TIES'はいくつかの問題のケースでは正しくないかもしれません:http://stackoverflow.com/questions/2611822/distinct-with-count-and-sql-server-2005/2612456#2612456 –

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