0

SQL ServerのMaxコマンドを使用して、いくつかの低レベルの結果を取り除く必要があるクエリを実行しています。次に、より高いレベルのGroup Byステートメントを作成するにはどうすればよいですか?私はこれに一時テーブルを使用できることを知っています。私は大量のボリュームを期待しており、パフォーマンスの目的で一時テーブルを作成および破棄することは避けたいと考えています。

SELECT k.Result_ID, k.Key_Name, max(k.Value_Percentage) as Percentage 
FROM Key_Word k
LEFT JOIN Phrase p 
    ON p.Result_ID = k.Result_ID 
    AND p.Key_Name = k.Key_Name 
    AND k.Phrase_Flag = 1
    AND  @fulltextsearch LIKE '%' + p.phrase + '%'
WHERE k.Key_Word IN 
    ('estimated', 'flow', 'cash', 'approximate', 'brian', 'go', 'store') 
    AND (k.Phrase_Flag = 0 OR p.Phrase IS NOT NULL)
GROUP BY k.Result_ID, k.Key_Name
ORDER BY k.Result_ID ASC;

ご協力いただきありがとうございます。

4

2 に答える 2

2

あなたは持っていることを探しています?:

SELECT k.Result_ID, k.Key_Name, max(k.Value_Percentage) as Percentage 
FROM Key_Word k
LEFT JOIN Phrase p 
ON p.Result_ID = k.Result_ID 
AND p.Key_Name = k.Key_Name 
AND k.Phrase_Flag = 1
AND  @fulltextsearch LIKE '%' + p.phrase + '%'
WHERE k.Key_Word IN 
('estimated', 'flow', 'cash', 'approximate', 'brian', 'go', 'store') 
AND (k.Phrase_Flag = 0 OR p.Phrase IS NOT NULL)
GROUP BY k.Result_ID, k.Key_Name
HAVING max(k.Value_Percentage) > 10

max(k.Value_Percentage)または、 Result_IDごとに表示する必要がある場合は、次を使用できます。WITH ROLLUP

于 2012-05-19T18:12:32.660 に答える
0

下位レベルの結果を「取り除く」ことについて話すときに、どのような原則を念頭に置いているかはあまり明確ではありません。特定の値に基づいて結果をフィルタリングする場合は、 a1ex07の答えが正しい方法のようです。

ただし、返されたMAX値のランキングに従ってそれらをフィルタリングすることを意味する場合(つまり、MAX値が最上位の行のみ、または場合によっては上位3つの値の行のみを表示する)、次のように実行できます。

  1. 使用TOP 1 WITH TIES1最上位のMAXでのみ確実に機能するため):

    SELECT *
    FROM (
      SELECT TOP 1 WITH TIES
        k.Result_ID, k.Key_Name, MAX(k.Value_Percentage) as Percentage 
      FROM Key_Word k
      LEFT JOIN Phrase p 
          ON p.Result_ID = k.Result_ID 
          AND p.Key_Name = k.Key_Name 
          AND k.Phrase_Flag = 1
          AND  @fulltextsearch LIKE '%' + p.phrase + '%'
      WHERE k.Key_Word IN 
          ('estimated', 'flow', 'cash', 'approximate', 'brian', 'go', 'store') 
          AND (k.Phrase_Flag = 0 OR p.Phrase IS NOT NULL)
      GROUP BY k.Result_ID, k.Key_Name
      ORDER BY MAX(k.Value_Percentage) DESC
    ) s
    ORDER BY Result_ID ASC;
    
  2. 次の機能を使用しDENSE_RANK()ます(SQL Server 2005以降のバージョンが必要です)。

    SELECT *
    FROM (
      SELECT DENSE_RANK() OVER (PARTITION BY MAX(k.Value_Percentage)) AS ranking
        k.Result_ID, k.Key_Name, MAX(k.Value_Percentage) as Percentage 
      FROM Key_Word k
      LEFT JOIN Phrase p 
          ON p.Result_ID = k.Result_ID 
          AND p.Key_Name = k.Key_Name 
          AND k.Phrase_Flag = 1
          AND  @fulltextsearch LIKE '%' + p.phrase + '%'
      WHERE k.Key_Word IN 
          ('estimated', 'flow', 'cash', 'approximate', 'brian', 'go', 'store') 
          AND (k.Phrase_Flag = 0 OR p.Phrase IS NOT NULL)
      GROUP BY k.Result_ID, k.Key_Name
    ) s
    WHERE ranking <= n
    ORDER BY Result_ID ASC;
    
于 2012-05-20T12:33:37.823 に答える