2016-12-18 5 views
1

タイトルに記載されているとおり、いくつかのSQLをAccessで実行すると、3つの基準に基づいて0/1の変数が与えられます。まず、新しい変数は、同じである列Aのすべての値を比較する必要があります。第2に、B列の値が最大であれば(私の場合はそうでなければならない)、C列の値が最大であるかどうかをチェックする必要があります(私の場合、でなければなりません)。SQL 0/1変数にアクセスし、3つの条件を満たす:1.列Aの値が同じ2.列Bの値が最大でない3.列Cの値が最大値

通常、私は1行の列にわたって単純なIIf文を実行しますが、ここでは、同じである列Aのすべての値を比較する必要があります。値をC列の対応する「最大値」と比較します。

この目的のために新しいクエリを作成する必要がありますが、クエリを実行し、列Dに新しい変数を取得し、0/1変数を与えますか?

は、それは完全に透明、私のデータは、以下のようなものに見えるようにするには、次の行のthousindsの

A  B  C 
10 4 12-04-2014 
10 5 02-17-2015 
10 7 08-11-2016 
10 8 08-31-2016 
10 6 09-05-2016 

そして、そこだろうhoundredsを、どこそこらで10

から異なるだろうこの例では、最後の行のみが列Dの値1を取得します。これは最新の日付を持つため、列AのID値の列Bの最高値ではありません。

  • マーク
+0

は、あなたが最高値を選択できるようにしたいです列Cを選択し、列Dの対応する行に値1を割り当てます。 – kplus

+0

正確ではありません。これは最初の基準にすぎません。 Dの値1は、Cの値が最も高い場合にのみ得られ、Bの値は最高ではない。そして、Aの値が行全体にわたって同じであるBとCの値だけを比較できることを考慮する必要があります。 –

+0

問題は、特定のフェーズへのリターンを測定する必要があることです。その理由は、列Bが重要であり、値がこの列の中で最も高いことはできません。 –

答えて

0
SELECT x.a,x.b,x.c, 
    CASE 
    WHEN x.b<>(SELECT max(xx.b) FROM yourtable xx WHERE xx.a=x.a) 
    AND x.c=(SELECT max(xx.c) FROM yourtable xx WHERE xx.a=x.a) 
    THEN 1 
    ELSE 0 
    END AS d 
FROM yourtable x 

OVER使用(X.A BY PARTITION)は、より効率的であるが、アクセスが私の知る限り、これを許可しません。

0

MySQLでは、あなたはこれを行うことができますように。

select t.*, 
     iif(x.b <> (select max(tt.b) from t as tt where tt.a = t.a) and 
      x.b = (select max(tt.c) from t as tt where tt.a = t.a), 1, 0 
     ) as flag 
from t; 
ます。また、この使用して集約処理することができます

:平野用語で

select t.*, 
     iif(tt.maxb <> t.b and tt.maxc = t.c, 1, 0) as flag 
from t inner join 
    (select tt.a, max(tt.b) as maxb, max(t.c) as maxc 
     from t as tt 
     group by tt.a 
    ) as tt 
    on tt.a = t.a;