sql >> データベース >  >> RDS >> Sqlserver

MSSQLは、ネクタイと各カテゴリから少なくとも1つを含む、上位10の勝利スコアを選択します

    ご覧のとおり、行をより洗練された方法でランク付けする必要があります。これにより、すべてのカテゴリの上位のエントリが値に関係なく含まれ、上位のエントリ以外のエントリが全体に応じて含まれるようになります。ランキング。

    私が提案しようとしていることは、最も効率的な解決策ではないかもしれませんが、それはうまくいくはずであり、他に何もできない場合は、他の誰かにもっと良いものを考え出すように促すかもしれません:

    WITH ranked1 AS (
      SELECT
        *,
        RankByCategory = DENSE_RANK() OVER (
          PARTITION BY CategoryID
          ORDER BY Score DESC
        )
      FROM YourTable
    ),
    ranked2 AS (
      SELECT
        *,
        FinalRank = DENSE_RANK() OVER (
          ORDER BY
            CASE RankByCategory WHEN 1 THEN 1 ELSE 2 END,
            Score DESC
        )
      FROM ranked1
    )
    SELECT
      EntryID,
      CategoryID,
      Score
    FROM ranked2
    WHERE FinalRank <= @top_n
    ;
    

    最初のCTEは、カテゴリごとに行をランク付けすることです。これにより、どのエントリがそれぞれのカテゴリの上位になるかを確認できます。次のステップ(2番目のCTE)は、グローバルランキングを取得することです。今回は、エントリがそのカテゴリのトップであるかどうかを考慮します。カテゴリの上位値はランクが低くなるため、最終結果に確実に含まれます。 (もちろん、カテゴリの数が、出力で受け取りたい個別の値の数を超えないようにする必要があります。)

    これがSQLFiddleでの実例 です。 遊ぶ。




    1. SQLの日付に従って列をカウントします

    2. SQLのデータ型のサイズを変更します

    3. ENUMがMySQLに複数の値を格納しないのはなぜですか?

    4. EloquentのINステートメント