2

私がする場合

dense_rank() over (order by colname),

列 colname に同じ値を持つすべての行で同じランクを取得します。

ただし、同じランクの行の数を @maxrows に制限して、@maxrows 行の colname の値が同じ場合、colname の値がまだ同じであっても、次の行に新しいランクが割り当てられるようにします。

どうすればこれを達成できますか?

4

1 に答える 1

3

これは、いくつかのランキング関数を使用して実現できます。ROW_NUMBER()タイブレークを実行するために、中央と別の列で使用します。

declare @maxRows int
set @maxRows = 5

; With InitialRanks as (
    select DENSE_RANK() OVER (ORDER BY type) as rnk,* from sys.objects
), OrderedRanks as (
    select (ROW_NUMBER() OVER (PARTITION BY rnk ORDER by object_id)-1)
            / @maxRows as rn,*
    from InitialRanks
)
select DENSE_RANK() OVER (ORDER BY rnk,rn),* from OrderedRanks

ここでは、各 (最終) ランク値で最大 5 つの列しか取得しません。ランキングはに基づいていますが、特定のランクを許可する行の順序を決定するためにセカンダリ カラムとしてtype使用します。object_id


上記を複雑にしすぎたことがわかりました-最初のCTEと最初のCTEは必要ありません。これは、関数内の列DENSE_RANKのプロキシとして効果的に機能しているためです-列を直接使用して物事を単純化しないでください:typeROW_NUMBER()type

declare @maxRows int
set @maxRows = 5

; With  OrderedRanks as (
    select (ROW_NUMBER() OVER (PARTITION BY type ORDER by object_id)-1)
            / @maxRows as rn,*
    from sys.objects
)
select DENSE_RANK() OVER (ORDER BY type,rn),* from OrderedRanks
于 2013-12-18T11:46:29.577 に答える