1
SELECT team, sum(maths)
FROM marks
GROUP BY team
HAVING sum(maths) = (
    SELECT max(sum(maths))
    FROM marks
    GROUP BY team
)

チーム A、B、C の 3 つのチームがあり、その中に何人かのメンバーがいます。

最初に使用してSELECT max(sum(maths)) FROM marks GROUP BY team、数学の最大合計を取得しています。

クエリ全体を使用して、数学で最高の合計を獲得したチームを表示しようとしています。

HAVINGをに置き換えるようにクエリを書き直すにはどうすればよいですかWHERE

4

5 に答える 5

1

してみてください:

select * from (
  select team, v maxmarks, row_number() over (order by v desc) RNum from(
    SELECT team, sum(maths) v
    FROM marks 
    group by team 
  )x
)xx where RNum=1;
于 2013-04-17T06:30:42.220 に答える
0

結果を並べ替える場合は、疑似SELECT列を使用して、結果を最初の行に制限するアウターでラップできます。ROWNUM

SELECT *
FROM (
    SELECT team, sum(maths)
    FROM marks
    GROUP BY team
    ORDER BY sum(maths) DESC
)
WHERE ROWNUM = 1;

ROW_NUMBERまたは、分析関数を使用して、再び外側の選択でラップすることもできます。

SELECT *
FROM (
    SELECT team, sum(maths),
        ROW_NUMBER() OVER (PARTITION BY team ORDER BY sum(maths) DESC) AS rn
    FROM marks
    GROUP BY team
)
WHERE rn = 1;
于 2013-04-17T06:36:43.950 に答える
0

共通テーブル式を使用する別の方法:

with team_sum as (
  select   team,
           sum(maths) sum_maths
  from     marks
  group by team)
select *
from   team_sum
where  sum_maths = (
         select max(sum_maths)
         from   team_sum)

非常に多数のチームの場合、オプティマイザーは team_sum 共通テーブル式の結果セットを具体化し、それに対して max() を実行できるため、うまく機能します。

また、同じ合計スコアを共有する複数のチームも一覧表示されます。

于 2013-04-17T08:26:06.150 に答える
0

他の方法よりも効率的ではありませんが、複数の方法が必要な場合は、これを試すことができます。

SELECT DISTINCT FIRST_VALUE(TEAM) OVER(ORDER BY SUM(MATHS) DESC),
          FIRST_VALUE(SUM(MATHS)) OVER(ORDER BY SUM(MATHS) DESC)
FROM MARKS
GROUP BY TEAM
于 2013-04-17T06:51:19.117 に答える
0

HAVING を WHERE に置き換えることは可能ですが、そうしてもメリットはありません。

select team, sum(maths) from
(
   SELECT team, sum(maths) as total
   FROM marks
   GROUP BY team
) t1
where t1.total = ( select max(t1.total) from t1 )
于 2013-04-17T06:20:17.030 に答える