2017-01-12 5 views
0

によってグループ内にない列が含まれ、
は、私は次の列を持っていることを前提としています:SQL Serverの、私は永久的な問題を抱えているの文

T:A(PK), B, C, D, E 

select A, MAX(B) from T group BY A 

いいえ、私はできません:

私は理解できません - になるとAVGまたはSUM私はそれを手に入れました。しかし、MAXまたはMINが正確に1つの行から取得しています。

どうすれば対処できますか?あなたはこのようにそのためROW_NUMBER()を使用することができます

+3

"MAXまたはMINはちょうど1行から取得しています。" - 本当に?たとえば、複数の行が 'B'列に同じ値を持ち、その値が最小値または最大値を表すような状況に遭遇したことはありませんか? –

+1

C列のデータはどうしますか?それをグループ化したい場合は、グループ部分に追加するだけです: 'from T group BY A、C' Column Cの出力は何ですか? –

+0

デバッガで許可されていない場合は、1行だけではないことを意味します。 – SKLTFZ

答えて

1

select A, C, B 
from (
    select * 
     , row_number() over (partition by A order by B desc) seq 
     --      group by^ max(^) 
    from yourTable) t 
where seq = 1; 
+0

'where seq = 1' - それはどういう意味ですか? –

+0

この回答は私が提案しようとしているものです。サブ問合せでは、列に番号を付け、最大(B)を降順で並べ替え、「seq」と呼ぶ列で順序付けします。次に、seq = 1を選択します。これは、他のすべてのデータ(例:col C)と共に、最も高いBを持つ行になります。 –

+0

複数の行の間に繋がりがある場合、何が起こるかここで言及する価値があります。この例では、* 1 *の行を任意に選択します。 –

0

の原因の列が選択リストに含まれてそれはまたgroup by句の一部である必要があります。グループの一部であるが選択リストには存在しない列を持つことができますが、その逆もできません。

通常、グループ化を実行するselect句には、それらの列のみを入れます。

0

これを試してください。それはあなただけで1列(F1)でMAXを見つけるのに役立つ、ともあなたが望んでいた列(F3)を追加することなく、

SELECT m.f1,s.f2,m.maxf3 FROM 
(SELECT f1,max(f3) maxf3 FROM t1 GROUP BY f1) m 
CROSS APPLY (SELECT TOP(1) f2,f1 FROM t1 WHERE m.f1 = f1) s 
0

あなたMAXの動作に影響を与えていないあなたの質問は、我々は「ARENという点で非常に明確ではありませんすることができますあなたがしようとしていることを確かめてください。

メインのクエリで実際にグループを実行するのではなく、A列に基づいてBの最大値を返したいと仮定して、そうすることができます。

select A, C,(Select Max(B) from T as T2 WHERE T.A = T2.A) as MaxB from T 
関連する問題