2009-07-25 21 views
1

私がやりたいことは、max(f1、f2、f3)を選択することです。私はこれが動作しないことを知っている 、しかし私は私がほしいと思うものはかなり明確であるべきであると思う (アップデート1を見なさい)。SQLで複数のフィールドに対してmaxを選択するにはどうすればよいですか?

私はselect max(concat(f1、 ' - '、f2 ...))を行うことを考えていましたが、これにはさまざまな欠点があります。特に、連結を行うことは、おそらく物事を遅らせるでしょう。私が望むものを得るための最善の方法は何ですか?

更新1:私がこれまでに得た答えは、私が後にしたものではありません。 maxは一連のレコードに対して機能しますが、1つの値だけを使用して比較します。私はいくつかの値を考慮することができる順序のように、いくつかの値を最大限に考慮したい。

アップデート2:私は、次の表があるとします。

 
id class_name order_by1 order_by_2 
1   a   0   0 
2   a   0   1 
3   b   1   0 
4   b   0   9 

私はそのCLASS_NAMEでグループレコードを意志の問合せをしたいです。次に、各クラス内で、order_by1で昇順に並べ替えた後、order_by2で昇順になるレコードを選択します。

 
select max(* order by order_by1 ASC, order_by2 ASC) 
from table 
group by class_name 
+0

実際、完全にはっきりしていません。 f1、f2&f3の合計が最大である場合、または3のうち最大のものが最大である場合、または何が結果になりますか? –

+0

いくつかのサンプルデータを出力できますか?私はそれが私達が理解する必要があると思うものだと思う。 – AdaTheDev

+0

実際に聞いた質問に対する回答だけが得られる。あなたがもともと尋ねた質問に対して、ここの答えはうまくいきます。将来、質問をあまり単純化しないようにして、実際に答えが必要な質問をしてください。 "あなたはおとぎ木を食べることができるかどうか実際に知りたいのですが、"私は果物を食べることができますか? " –

答えて

4
Select max(val) 
From 
(
    Select max(fld1) as val FROM YourTable 
    union 
    Select max(fld2) as val FROM YourTable 
    union 
    Select max(fld3) as val FROM YourTable 
) x 

編集:別の選択肢がある:

SELECT 
    CASE 
     WHEN MAX(fld1) >= MAX(fld2) AND MAX(fld1) >= MAX(fld3) THEN MAX(fld1) 
     WHEN MAX(fld2) >= MAX(fld1) AND MAX(fld2) >= MAX(fld3) THEN MAX(fld2) 
     WHEN MAX(fld3) >= MAX(fld1) AND MAX(fld3) >= MAX(fld2) THEN MAX(fld3) 
    END AS MaxValue 
FROM YourTable 
+0

うーん...面白いアプローチ! –

+0

+1を 'UNION'にします。確かに読みやすいですが、あまり効率が悪いです。 – Quassnoi

+1

UNIONの代わりにUNION ALLを使う方が効率的かどうか疑問に思っています。 –

3

私は、結果セットが私の魔法のクエリ言語のレコード2と3で構成されます、それは次のようになりますこれらのいずれかを持っている。

CREATE FUNCTION [dbo].[MathMax] 
( 
@a int, 
@b int 
) 
RETURNS int 
WITH SCHEMABINDING 
AS 
BEGIN 
IF @a IS NULL AND @b IS NULL 
    RETURN 0 

IF @a IS NULL 
    RETURN @b 

IF @b IS NULL 
    RETURN @a 

IF @a < @b 
    RETURN @b 

RETURN @a 
END 

それから私は、私はこれはとほぼ同じ実行信じるT1

の中から選択dbo.MathMax(dbo.MathMax(MAX(F1)、MAX(F2))、MAX(F3))を行うことができますCASEはより読みやすく、マルチUNIONよりもはるかに優れています(UNION ALLよりも少し効率的です)。私は別の質問に与えた回答に基づいて

+0

これは最高の答えです! jpj625から。 UNIONまたはUNIONALLまたはCASE文の複雑なルートに行く理由は、私にはありません。 私はこれをひどく必要としました...そして、intとdatetimeの両方でそれをテストしました...本当に完璧に動作します高性能... これに5スター。ありがとう、jpj625。 私は...アクセス2010ユーザーと私は...アクセスモジュールのためのウェブ http://allenbrowne.com/func-09.html から同様の機能をコピーして、SQL Serverを思っていたことは似た何かをすることができます。最後にこれを見つけました。ブラボ!!! – ihightower

+0

これは、スカラーUDFがカーソルのように各行に対して呼び出されるため、うんざりのように機能します。 http://sqlblog.com/blogs/adam_machanic/archive/2006/08/04/scalar-functions-inlining-and-performance-an-entertaining-title-for-a-boring-post.aspx –

1

あなたのクラスにより、グループは(複数の列かもしれない)とlimit 1との組み合わせで、通常order byを使用して列リスト内副選択を使用します。

関連する問題