2015-03-16 3 views
0

У меня есть таблица со следующими столбцамиПолучить разницу между значениями в MySQL

id pl_date  month scores kID 
1 20015/02/04 02  9  244 
2 20015/02/05 02  12  244 
3 20015/02/08 02  8  244 
4 20015/02/22 02  24  244 
5 20015/03/10 03  10  244 
6 20015/03/11 03  12  244 
7 20015/03/12 03  10  244 
8 20015/03/13 03  12  244 

Моя цель состоит в том, чтобы вычислить разницу партитуры с помощью конкретных ВЫБРАТЬ с MySQL

id pl_date  month scores kID  diff 
1 2015/02/04  02  9  244  -3 
2 2015/02/05  02  12  244  +4 
3 2015/02/08  02  8  244  -16 
4 2015/02/22  02  24  244  +14 
5 2015/03/10  03  10  244  -2 
6 2015/03/11  03  12  244  +2 
7 2015/03/12  03  10  244  -2 
8 2015/03/13  03  12  244  12 

Я пытался использовать подзапрос как показано ниже, но это не сработает.

SELECT b.id, (b.max_count-b.min_count) AS DIFF 
FROM 
    (SELECT id, MAX(scores) as max_count, MIN(scores) as min_count 
    FROM myTable 
    WHERE month = 03 AND kID = 244 
    GROUP BY kID) b 
+4

Сроки действительно придерживаться определенного формата в SQL. Я не собираюсь. – Strawberry

+0

в формате даты mysql похожи на 'yyyy-mm-dd' –

+0

Извините, когда я отправил свой вопрос, я перевернул формат даты. Конечно, формат даты - «ГГГГ-мм-дд». – user4265789

ответ

0

Вы можете присоединиться к таблице с самим собой (автообъединение), но с идентификатором сдвинутой на один, чтобы сделать это:

select t1.*, ifnull(t1.scores - t2.scores, t1.scores) as diff 
from table1 t1 
left join table1 t2 on t1.id + 1 = t2.id 

Если вы хотите только дифф быть вычислены в некоторых группировка (например, kID), просто добавьте эти условия в соединение.

Другой подход заключается в использовании связанного подзапроса (это использует даты вместо идентификатора для определения преемника):

select 
    t1.*, 
    t1.scores 
    - ifnull(
    (select scores 
    from table1 
    where pl_date > t1.pl_date 
    limit 1) 
,0) as diff 
from table1 t1 
order by id; 

Sample SQL Fiddle (оба подхода)

+0

, это будет работать только в том случае, если столбец идентификатора автоинкремента ... Что делать, если индекс пропущен? Я считаю, что он должен основываться на дате – cyadvert

+0

@cyadvert Действительно. – jpw

+0

Сценарий выше не дает ожидаемого результата – user4265789