2015-07-19 4 views
0

Я имею эту таблицу в MYSQL:MYSQL - применять где положение только некоторые поля

Year Type Value ID 

0  0  5  1 
2010 1  6  1 
2011 1  4  1 
2012 1  5  1 
2013 1  7  1 
2014 1  8  1 
2015 1  5  1 
0  0  6  2 
2009 1  7  2 
2010 1  4  2 
2011 1  2  2 
2012 1  8  2 
2013 1  8  2 
2014 1  5  2 

Я хочу, чтобы выбрать минимальный и максимальный год для каждого человека (идентификаторами 1 и 2), но я также хочу для выбора значения, связанного с типом 0 для каждого человека. В идеале это то, что результат запроса будет выглядеть следующим образом:

ID MinYear MaxYear Type0Value 
1 2010  2015  5 
2 2009  2014  6 

запрос должен выглядеть, я думаю, что-то вроде этого ...

select ID, 
(min(year) where type = 1) as MinYear, 
(max(year) where type = 1) as MaxYear, 
(value where type = 0) as Type0Value 
from table 
group by ID 

Но это, очевидно, не правильный синтаксис SQL. Как мне это сделать?

+0

Что вы думаете об использовании self join? –

+0

Ах, совсем забыл об этом! Спасибо – japem

ответ

3

странная структура таблицы, но:

select 
    _type0.id, 
    _type0.value, 
    _type1._min, 
    _type1._max 
from 
    tbl as _type0 
    inner join (
     select 
      id, 
      min(year) as _min, 
      max(year) as _max 
     from 
      tbl 
     where 
      1 = type 
     group by 
      id 
    ) as _type1 on 
     _type0.id = _type1.id 
where 
    0 = _type0.type; 
0

вы должны использовать внутреннее соединение. одна половина будет обрабатывать мин и макс, вторая половина type0value:

select a.minYear, a.maxYear, a.id, b.type0value from 
(select min(year) as minYear, max(year) as maxYear, id from table where id = 1 group by id) as a 
inner join table as b on a.id = b.id 
where b.type = 0 
+0

Я предполагаю, что ваш ответ обманут, @underscore_d предоставил ответ за 9 минут до вашего сообщения с той же логикой –

0

Ваш псевдо-код на самом деле довольно близко. Вам просто нужно условное агрегацию:

select ID, 
     min(case when type = 1 then year end) as MinYear, 
     max(case when type = 1 then year end) as MaxYear, 
     max(case when type = 0 then value end) as Type0Value 
from table 
group by ID; 

Если может быть несколько строк с type = 0, вы можете захотеть group_concat() вместо этого.

Смежные вопросы