3

私はこのようなテーブルを持っています

Group  Recipe    Priority
0       A         400
0       A         200
0       B         500
0       B         100
1       C         300
1       C         300
1       D         600

重要度は「グループ」>「優先度」>「レシピ」

グループ 0 が最初に移動する必要があります。グループ 0 内では、優先度 500 が最初に実行される必要があります (優先度が高いため) が、効率のために、すべてのレシピが最初に実行される必要があります。

ソート後、次のようになります

Group  Recipe    Priority
0       B         500
0       B         100
0       A         400
0       A         200
1       D         600
1       C         300
1       C         300

「並べ替え」を実行するさまざまな方法をすべて試しましたが、正しい方法が見つかりません。

お手伝いありがとう

4

2 に答える 2

12

問題は微妙です。優先順位ではなく、特定のグループ/レシピの組み合わせの最大優先順位で注文したい。つまり、この最大優先度に基づいて、すべてのレシピをまとめて保持する必要があります。

以下はこれを行います:

select t.Group, t.Recipe, t.Priority,
       max(priority) over (partition by t.group, t.recipe) as maxpriority
from tablename t
order by t.Group asc, 4 desc, t.Recipe, priority desc
于 2012-06-26T16:16:57.557 に答える
2

古いバージョンの Oracle では、分析関数が使用可能になる前は、次のようなクエリを使用して指定された結果セットを返していました。

SELECT f.group
     , f.recipe
     , f.priority
  FROM foo f
  JOIN ( SELECT g.group
              , g.recipe
              , MAX(g.priority) AS max_priority 
           FROM foo g
          GROUP BY g.group, g.recipe
       ) m
    ON m.group = f.group AND m.recipe = f.recipe
 ORDER BY f.group
        , m.max_priority DESC
        , f.recipe
        , f.priority DESC

このアプローチは、MySQL などの分析機能を持たない他のデータベースで機能します。

注: 上記のクエリは NULL セーフではありません。JOIN 述語によって、グループ列またはレシピ列に NULL 値を持つ行が削除されるからです。NULL セーフにすることもできますが、SQL が少し複雑になります。

SELECT f.group
     , f.recipe
     , f.priority
  FROM foo f
  JOIN ( SELECT g.group
              , g.recipe
              , MAX(g.priority) AS max_priority 
           FROM foo g
          GROUP BY g.group, g.recipe
       ) m
    ON (m.group = f.group OR COALESCE(m.group,f.group) IS NULL)
       AND (m.recipe = f.recipe OR COALESCE(m.recipe,f.recipe) IS NULL)
 ORDER BY f.group
        , m.max_priority DESC
        , f.recipe
        , f.priority DESC

SELECT リスト内の相関サブクエリを使用して同等の結果を取得することもできますが、この結果セットには追加の "max_priority" 列が結果セットに含まれます。

SELECT f.group
     , f.recipe
     , f.priority
     , (SELECT MAX(g.priority)
          FROM foo g
         WHERE (g.group = f.group OR COALESCE(g.group,f.group) IS NULL)
           AND (g.recipe = f.recipe OR COALESCE(g.recipe,f.recipe) IS NULL)
       ) AS max_priority
  FROM foo f
 ORDER BY f.group
        , 4 DESC
        , f.recipe
        , f.priority DESC

(相関サブクエリを SELECT リストから削除して、完全に ORDER BY 句に移動できるかどうかはテストしていません。それが機能する場合は、余分な列を返す必要はありませんが、そのクエリは非常に奇妙に見えます。)もう 1 つのオプション (余分な列を省略する) は、このクエリを (インライン ビューとして) 別のクエリでラップすることです。

SELECT e.group
     , e.recipe
     , e.priority 
  FROM (
        SELECT f.group
             , f.recipe
             , f.priority
             , (SELECT MAX(g.priority)
                  FROM foo g
                 WHERE (g.group = f.group OR COALESCE(g.group,f.group) IS NULL)
                   AND (g.recipe = f.recipe OR COALESCE(g.recipe,f.recipe) IS NULL)
                ) AS max_priority
          FROM foo f
       ) e
 ORDER BY e.group
        , e.max_priority DESC
        , e.recipe
        , e.priority DESC
于 2012-06-26T22:32:34.807 に答える