私がする場合
dense_rank() over (order by colname),
列 colname に同じ値を持つすべての行で同じランクを取得します。
ただし、同じランクの行の数を @maxrows に制限して、@maxrows 行の colname の値が同じ場合、colname の値がまだ同じであっても、次の行に新しいランクが割り当てられるようにします。
どうすればこれを達成できますか?
私がする場合
dense_rank() over (order by colname),
列 colname に同じ値を持つすべての行で同じランクを取得します。
ただし、同じランクの行の数を @maxrows に制限して、@maxrows 行の colname の値が同じ場合、colname の値がまだ同じであっても、次の行に新しいランクが割り当てられるようにします。
どうすればこれを達成できますか?
これは、いくつかのランキング関数を使用して実現できます。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
のプロキシとして効果的に機能しているためです-列を直接使用して物事を単純化しないでください:type
ROW_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