2015-07-16 3 views
0

В данный момент у меня следующую таблицу значений:Возврат особое значение задержки столбца в MySQL

-------------------------------- 
| ID | Action | Time | 
-------------------------------- 
| 1 | A   | 01 |  
| 1 | BB  | 10 | 
| 1 | C   | 12 | 
| 2 | C   | 05 | 
| 2 | A   | 08 | 
| 2 | BB  | 17 | 
| 2 | A   | 26 | 
| 2 | BB  | 47 | 

Предположим, что данные упорядочены в порядке возрастания Time. То, что я хочу для каждого вызова, когда данные сгруппированы по ID, чтобы новый столбец BB_Time который имеет разницу во времени ВВ и предыдущее событие в вызове, который будет выглядеть так:

---------------------------- 
| ID | ... | BB_Time | 
---------------------------- 
| 1 | ... | 09 |  
| 2 | ... | 21 | 

Если ВВ происходит в начале разговора, то BB_Time будет равен нулю, и если ВВ происходит более одного раза в вызове, столбец должен вернуть максимальную разницу во времени. EDIT: И если BB не появляется в вызове, то будет работать NULL или 0.

Ближайший (?) Я смог взломать это, ограничивая только BB действия в задаче WHERE таким образом, но это не дает отставания.

Мысли?

+0

Как вы получили идентификатор 1, BB, BB_Time 09: Если бы я выполнил ваш алгоритм, как описано, я получил бы ID 1, BB, BB_Time 10 –

+0

Что делать, если ID не имеет BB – Drew

+0

@Norbert, BB получает предыдущая строка для diff, поэтому 10-1 = 9 – Drew

ответ

1

Некоторые люди не доверяют переменные сессии, но я считаю, до тех пор, как вы осторожны, они относительно надежны. Отказ от ответственности: Я считаю, что MySQL официально не имеет определенного порядка оценки для оценки полей результатов SELECT. На практике это всегда будет слева направо, на что опирается этот запрос, однако это то, что нужно учитывать/переоценивать при изменении версий MySQL Server. Кроме того, я видел другие связанные вопросы здесь, которые предполагают, что такой запрос может не «хорошо играть» с VIEW.

SELECT ID, MAX(BB_Time) AS BB_Time 
FROM (
    SELECT ID, `Action` 
    , @prevID := IFNULL(@prevID, 0) AS prevID 
    , IF(`Action`<>'BB' 
     , 0 
     , IF(@prevID<>ID, 0, `Time` - IFNULL(@prevTime, `Time`)) 
    ) AS BB_Time 
    , @prevTime := `Time` 
    , @prevID := ID 
    FROM the_table 
    ORDER BY ID, `Time` 
) AS subQ 
GROUP BY ID 
; 

Обновлено показать все значения ID, с 0 для идентификаторов без каких-либо действий, BB.

Редактировать: Протестировано с образцами данных. Первый раз он вернулся с 0, второй раз он сработал. Возможно, необходимо инициализировать переменные сеанса @prev для чего-то, прежде чем выбор будет безопасным.

+0

не работает: < – Drew

+0

Какая ошибка? О, обновляя 'ORDER BY' сейчас. – Uueerdo

+0

без ошибок. играйте против своего стола, пока вы его получите – Drew

1

Вот a fiddle that works, а вот запрос ...

set @lastTime:=0; 
set @lastId:=0; 
select newId, max(TimeGap) from 
    (select (myTime - if(@lastId=id,@lastTime,0)) TimeGap, 
      (@lastTime:=myTime) NewTime, action, 
      (@lastId:=id) newId from myTable 
     order by id, myTime) AllTimeGaps 
where action = 'BB' group by newId 
+0

Что означает «не работает» означает – AgapwIesu

+0

Исправлено. Но добавим еще ... – AgapwIesu

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