2013-05-11 3 views
0

Я уже в течение нескольких часов безрезультатно, вытаскивая волосы.Mysql вычитание значений с использованием строки, выбранной из минимальной метки времени, группировка по идентификатору

Edit: Im желая, чтобы вычислить разницу между overall_exp колонки, используя одни и те же данные 1 день назад вычислить наибольший «выигрыш» для каждого пользователя

В настоящее время я взять строку, а затем выберите ряд от 1 день назад на основе временной метки первых строк затем вычесть overall_exp столбец из 2-х строк и порядка по этому результату в то время как группировка по user_id

SQL Скрипки: http://sqlfiddle.com/#!2/501c8

Вот что я в настоящее время, однако логика совершенно неверна, поэтому im pulling 0 results

SELECT rsn, ts.timestamp, @original_ts := SUBDATE(ts.timestamp, INTERVAL 1 DAY), ts.overall_exp, ts.overall_exp - previous.overall_exp AS gained_exp 
    FROM tracker AS ts 
INNER JOIN (
    SELECT user_id, MIN(TIMESTAMP) , overall_exp 
    FROM tracker 
    WHERE TIMESTAMP >= @original_ts 
    GROUP BY user_id 
) previous 
    ON ts.user_id = previous.user_id 
JOIN users 
    ON ts.user_id = users.id 
GROUP BY ts.user_id 
ORDER BY gained_exp DESC 
+1

Все образцы данных в SQLFiddle для одного дня (11 мая 2013 г.), поэтому независимо от того, какой запрос вы выполняете против него, вы никогда не получите строку за день до отметки времени данной строки. Кроме того, это далеко не ясно, что ** вы пытаетесь достичь - ваш существующий вопрос описывает только то, как ** вы пытаетесь его достичь. –

+0

Обновлено OP и SQLFiddle – Wader

+0

Спасибо, это яснее, но все еще немного неясно - вам нужна одна строка на пользователя в день, и если да, какая временная метка с одного дня вы хотите сравнить с какой меткой времени с предыдущего дня? В качестве альтернативы, вы хотите, чтобы одна строка в вашем результирующем наборе для каждой строки в «трекере», сравнивая дату и время в каждой строке с самой ранней датой и временем в предыдущие 24 часа (что, по-видимому, является логикой положенного запроса) ? Или что-то другое? –

ответ

1

Вы можете сделать это с автообъединением:

select t.user_id, max(t.overall_exp - tprev.overall_exp) 
from tracker t join 
    tracker tprev 
    on tprev.user_id = t.user_id and 
     date(tprev.timestamp) = date(SUBDATE(t.timestamp, INTERVAL 1 DAY)) 
group by t.user_id 

Ключевой здесь является преобразованием временного метких дат, так что сравнение является точным.

1

Try:

select u.*, max(t.`timestamp`)-min(t.`timestamp`) gain 
from users u 
left join tracker t 
on u.id = t.user_id and 
    t.`timestamp` >= date_sub(date(now()), interval 1 day) and 
    t.`timestamp` < date_add(date(now()), interval 1 day) 
group by u.id 
order by gain desc 

SQLFiddle here.

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

  • Нет связанных вопросов^_^