2017-11-30 7 views
0

私はいくつかのフィールドを持つテーブルを持っていると言うことができます。 、B、C、DMYSQLでGROUP BYの後にいくつかのフィールドで最も多く発生する値を選択

Iは、フィールドAによりグループに必要と

例B、C、Dから最もoccuring値選択:

+---+---+---+----+ 
| A | B | C | D | 
+---+---+---+----+ 
| 1 | 3 | 5 | 15 | 
+---+---+---+----+ 
| 1 | 5 | 6 | 32 | 
+---+---+---+----+ 
| 1 | 5 | 6 | 34 | 
+---+---+---+----+ 
| 2 | 7 | 5 | 50 | 
+---+---+---+----+ 
| 2 | 8 | 1 | 32 | 
+---+---+---+----+ 

期待される結果:

+---+---+---+----+ 
| A | B | C | D | 
+---+---+---+----+ 
| 1 | 5 | 6 | 15 | 
+---+---+---+----+ 
| 2 | 7 | 5 | 50 | 
+---+---+---+----+ 

COUNT(*)を使用して1つの列から発生する値の大部分を選択する方法と、その上にMAXを使用する方法の例が多数見られました。しかし、この場合何をすべきか?

+1

あなたはネクタイの場合に何をすべきでしょうか? –

+0

は関係ありません、私は最初の1つを選択すると思います –

答えて

0

3つの列に対して行う必要があるため、クエリは少し複雑に見えます。アイデアは、a-b、a-c、a-dの組み合わせによってカウントのグループ分けによって行をランク付けし、各組み合わせについて第1行を得ることである。これは変数を使用して行われます。カウントを繋ぐ場合は、b、c、またはdの最小値が返されます。 (これは、順序を逆にする必要がある場合に変更できます)。最後に、対応する値を1つの行に追加するにはもう1つの集計が必要です。

SQL Fiddle Demo

select a,max(b),max(c),max(d) 
from (
select a,b,c,d 
from (select a,b,c,d, 
     @rn:=case when @prev=a then @rn+1 else 1 end as rank, 
     @prev:=a 
     from (select a,b,null as c,null as d,count(*) as cnt 
      from tbl 
      group by a,b 
      ) t 
     cross join (select @rn:=0,@prev:='') r 
     order by a,cnt desc,b 
    ) t 
where rank = 1 
union all 
select a,b,c,d 
from (select a,b,c,d, 
     @rn:=case when @prev=a then @rn+1 else 1 end as rank, 
     @prev:=a 
     from (select a,null as b,c,null as d,count(*) as cnt 
      from tbl 
      group by a,c 
      ) t 
     cross join (select @rn:=0,@prev:='') r 
     order by a,cnt desc,c 
    ) t 
where rank = 1 
union all 
select a,b,c,d 
from (select a,b,c,d, 
     @rn:=case when @prev=a then @rn+1 else 1 end as rank, 
     @prev:=a 
     from (select a,null as b,null as c,d,count(*) as cnt 
      from tbl 
      group by a,d 
      ) t 
     cross join (select @rn:=0,@prev:='') r 
     order by a,cnt desc,d 
    ) t 
where rank = 1 
) t 
group by a 
+0

ありがとうございます。 このクエリは非常に複雑ですが、少なくとも動作します:) –

関連する問題