タイトルがあまり語っていないことは承知していますが、私の状況を説明させてください。
次の表があります。
今、私は各部門からトップ 1 を選択したいのですが、重複したポジション ID を取得したくないので、各部門のプロジェクト数でトップの従業員を求めていますが、ポジション ID は異なります。結果は強調表示された行です。
タイトルがあまり語っていないことは承知していますが、私の状況を説明させてください。
次の表があります。
今、私は各部門からトップ 1 を選択したいのですが、重複したポジション ID を取得したくないので、各部門のプロジェクト数でトップの従業員を求めていますが、ポジション ID は異なります。結果は強調表示された行です。
返された位置が最適であることを保証することはできません。1 つのポジションが 2 つの部門で最も優れている場合があります。その場合、結果の制約の 1 つを緩和する必要があります。
したがって、ここでは、ランキングが最も高いが明確な位置を持ついくつかの (おそらくすべての) 部門を取得する方法を示します。各部門の最高ランクの従業員のみを選択することから始めます。これらは、最も多くのプロジェクトを持つものです。
次に、それぞれについて、PositionTypeId
これらの選択肢の中からランダムに部門を選択します。次に、部門ごとに、ランダムなポジション タイプを選択します。次のクエリは、このアプローチを採用しています。
select DepID, EmplyeeID, PositionTypeId, NumProjects
from (select t.*, row_number() over (partition by DepId order by newid()) as seqnum
from (select t.*, row_number() over (partition by PositionTypeId order by newid()) as position_seqnum
from (select t.*,
dense_rank() over (partition by DepId order by NumProducts desc
) as rank_seqnum
from t
) t
where rank_seqnum = 1
) t
where position_seqnum = 1
) t
where seqnum = 1;
これは、部門ごとに行が返される保証はありません。ただし、返されるすべての部門が異なる職位タイプを持つことが保証されており、行はその部門に最適です。おそらく、中央のステップを微調整して、より多くの部門をカバーできるようにすることができます。ただし、問題の解決が保証されているわけではないため、そのような微調整は、その価値よりも多くの労力を必要とする場合があります。