2017-10-13 14 views
0

私は実際の問題の縮小版である以下の表をmysqlに持っています。集計後に追加の列を保存するにはどうすればよいですか?

私は、次の表を取得するには、*の付いた行を選択したい
+-------+-------+-------+-------+ 
| a_col | b_col | c_col | extra | 
+-------+-------+-------+-------+ 
|  1 |  1 |  1 |  7 |* 
|  1 |  2 |  1 | 10 | 
|  1 |  2 |  2 | 20 |* 
|  1 |  3 |  2 | 20 | 
|  1 |  3 |  3 | 15 |* 
+-------+-------+-------+-------+ 

+-------+-------+-------+-------+ 
| a_col | b_col | c_col | extra | 
+-------+-------+-------+-------+ 
|  1 |  1 |  1 |  7 | 
|  1 |  2 |  2 | 20 | 
|  1 |  3 |  3 | 15 | 
+-------+-------+-------+-------+ 

2つの行がa_colとb_colに同じ値を持っている場合は、最大を持っているものを保ちますc_colの値は

私の試みがあった。

select a_col, b_col, max(c_col), extra 
from mytable 
group by a_col, b_col 

しかし、私は、次のエラーメッセージが表示されます:私は私が望むものに近いものを得る「余分な」欄に言及せずに

ERROR 1055 (42000): Expression #4 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'bd17_g12.mytable.extra' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 

+-------+-------+------------+ 
| a_col | b_col | max(c_col) | 
+-------+-------+------------+ 
|  1 |  1 |   1 | 
|  1 |  2 |   2 | 
|  1 |  3 |   3 | 
+-------+-------+------------+ 

をしかし、私はあなたが得ることができる「エクストラ」列

答えて

0

の値を保持する必要がありますextraおよびc_col列を集約して、group_concatの機能を適用します。私が理解したようそして、あなたがsubstring_index

select a_col, b_col, max(c_col), 
substring_index(group_concat(extra order by c_col desc),',',1) `extra` 
from mytable 
group by a_col, b_col 

DEMO

または自己と

その上を使用することができます関連の最高c_col及びその関連余分な値を選択することは、

select a.* 
from mytable a 
left join mytable b 
      on a.a_col = b.a_col 
      and a.b_col = b.b_col 
      and a.c_col < b.c_col 
where b.c_col is null 

DEMO

0

に参加します最大のc_colにはextraが必要です。

SQL Fiddle

のMySQL 5.6スキーマのセットアップ

クエリ1

select t2.* 
from (
    select a_col, b_col, max(c_col) c_colm 
    from t 
    group by a_col, b_col 
) t1 
    INNER join t t2 
    on t1.a_col = t2.a_col 
     and t1.b_col = t2.b_col 
     and t1.c_colm = t2.c_col 

Results

| a_col | b_col | c_col | extra | 
|-------|-------|-------|-------| 
|  1 |  1 |  1 |  7 | 
|  1 |  2 |  2 | 20 | 
|  1 |  3 |  3 | 15 | 
0

extra列を含めると発生するエラーは、低いバージョンのmysql(バージョン5.5など)では発生しないようです。したがって、問題は、ここで説明するようなより高いバージョンのmysqlについては 'ONLY_FULL_GROUP_BY`の問題である可能性があります:Error Code: 1055 incompatible with sql_mode=only_full_group_by