2013-10-10 2 views
-1

У меня есть таблица с некоторыми значениями, вставленных на ежедневной основе, что-то вроде этогоВыберите максимальную разницу между 2 строки с одинаковым значением (статистика)

----------- 
id | count 
----------- 
1 | 97 
2 | **97** 
3 | 59 
4 | 62 
5 | 47 
6 | 59 
7 | 59 
8 | **97** 
----------- 

мне нужно, чтобы получить разницу в день максимальных между повторяющимися значениями , т. е., поскольку вы можете видеть, что первое и второе значение равно 97, то есть разница в 1 день, но следующее появление 97 - через 6 дней, поэтому мне нужно получить эту «максимальную» разницу (6).

же самое для 59, разница в день максимальных 3 дней (3) - между 3-й день и 6.
В этот момент I`m с помощью PHP массивы как в этом примере:

$q = " SELECT id FROM table WHERE VALUE = 97 "; 
// etc ... the array looks like this 
$array = {1, 2, 8}; 

тогда я получаю «Макс» разницу, но я просто хочу знать, если есть способ сделать это в MySQL, благодаря

EDIT:

//if we list only the column "count": 
44 5 *97* 74 5 **97** 7 3 2 31 9 8 4 2 1 **97** 4 7 7 8 *97* 

step1: «97» находится в 3-м положении, затем в 6-м положении (разность = 3)
Шаг2: «97» находится в 6-м положении, затем в 16-м положении (разность = 10)
step3: «97» находится в шестнадцатой позиции, а затем в 21-м положении (дифф = 5)
step4: MAX дифф =

я должен жаловаться на это, я отвечал на этот вопрос, в 08:59 утра, я перезарядил страницу 1 минут спустя (в 9:00), и он уже был проголосован, не было времени, чтобы прочитать и понять вопрос, это абсурд

+0

я должен жаловаться на это, я отвечал на этот вопрос, в 08:59 утра, я перезарядил страницу 1 минуту (В 9:00), и он уже был проголосован, не было времени, чтобы прочитать и понять вопрос, это абсурд – user1626498

+0

так 'id' =' day'? – Strawberry

+0

Вы были, вероятно, проголосованы из-за отсутствия ясности в своем посте. Как спросил @Strawberry, «ID» совпадает с вашим «днем»? – Andrew

ответ

0

Обе работы:

http://sqlfiddle.com/#!2/243f2/22

select a.blahday ad, max(b.blahday) bd, a.blahday - max(b.blahday) diff from blah a join blah b using (blahcount) 
    where blahcount = 97 
    and a.blahday > b.blahday 
    group by ad 
    order by diff desc 
    limit 1 

http://sqlfiddle.com/#!2/243f2/25

select a.blahday ab, 
    (select max(blahday) from blah where blahcount = a.blahcount and blahday < a.blahday) bd 
    from blah a 
where blahcount = 97 
order by ab - bd desc 
limit 1 
+0

http://sqlfiddle.com/#!2/243f2/22 - Прекрасно работает, спасибо большое! Я предпочитаю это, потому что у него нет вложенного выбора – user1626498

0

Попробуйте это:

select 
(`a`.`max_id` - `b`.`min_id`) as `max_day_diff`, `a`.`count` 
from 
(select max(id) as `max_id`, `count` 
    from `table` group by `count` 
) a 
inner join 
(select min(id) as `min_id`, `count` 
from `table` group by `count` 
) b 
on `a`.`count` = `b`.`count` 

Это скрипку: http://sqlfiddle.com/#!2/1a6a3/10

Это даст max_day_diff как 0 для строк только с одним значением счетчика (например, 62, 47 в вашем случае)

+0

Эй, Максим, я пробовал это, но это повторяет разницу между первым и последним вхождением, а не максимальную разницу между значениями (т.е. 1 2 1 3 5 7 5 7 8 2 2 1 0 0 9 7 8 1 - как вы можете см. первый и последний, но максимальная разница между позициями 3 и 12, что было бы разницей в 9) – user1626498

+0

Можете ли вы обновить свой вопрос с помощью результата, который вы ищете? – Maximus2012

+0

сделано, пожалуйста, прочитайте его еще раз. – user1626498

0

I подумайте, что это даст вам то, что вы ищете.

SQLFiddle!

Это довольно фанки стол у вас есть, кстати.

+0

спасибо Andrew, но та же проблема, это получает разницу между кулаком и последним вхождением – user1626498

+0

Итак, вы хотите посмотреть на каждый пробел, а затем найти максимальные эти пробелы? Я не думаю, что вы можете делать такую ​​обработку строк за строкой в ​​чистом SQL. – Andrew

+0

Я думаю, что вы правы, спасибо в любом случае – user1626498

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