1

重みを表す3番目の列を持つKey-Valueペアテーブルがあります。私がしたいのは、重み値に基づいて、降順で各ペアの最初のn行を取得することです。

これを行うための自然な方法をサポートする主流のSQLテクノロジーはありますか?または私は常にいくつかのハックを含める必要がありますか...

データ例:

key value   weight   
15391   22877   8    
15391   24311   7    
15391   460     7    
22634   22877   6   

ペアごとに上位2行を選択したいので、結果は次のようになります。

15391   22877   8    
15391   24311   7        
22634   22877   6 
4

2 に答える 2

4

私はあなたの説明が誤解を招くと思います、そしてあなたが本当に欲しいのはこれです:

select key, value, weight
from (
    select *,
        row_number() over(partition by key order by weight desc) rn
    from aggregated_table
) s
where rn <= 2
order by weight desc, key

上記はPostgresqlとSQLServerで機能します。これはMySQLでは機能しますが、SQLServerでは機能しません。

select key, value, (
    select weight
    from aggregated_table
    where key = s.key
    order by weight desc
    limit 1
    ) weight
from aggregated_table
union
select key, value, (
    select weight
    from aggregated_table
    where key = s.key
    order by weight desc
    limit 1 offset 2
    ) weight
from aggregated_table
order by weight desc, key
于 2013-03-25T14:07:55.110 に答える
3

これはPostgresで簡単に実行できます。

select key, value, weight
from (select key, value, weight, row_number() over (partition by key, value order by weight desc) as seqnum
      from t
     ) t
where seqnum <= 2

MySQLとPostgresの両方で機能するバージョンが必要な場合は、相関サブクエリを使用します。

select key, value, weight
from (select key, value, weight,
             (select count(*) from t t2 where t2.key = t.key and t2.value = t.value and t2.weight >= t.weight
             ) as seqnum
      from t
     ) t
where seqnum <= 2
于 2013-03-25T13:56:04.783 に答える