2015-07-21 3 views
0

У меня есть таблица вроде этого:MySQL - Выберите различных изменения поисковых работ на различном упорядоченных рядах

T    A B C ID 
2015-07-19  a b c 1 
2015-07-16  a y z 2 
2015-07-21  a b c 1 
2015-07-17  a y c 2 
2015-07-18  a y c 1 
2015-07-20  a b c 1 
2015-07-17  a y c 1 
2015-07-19  a b c 2 
2015-07-16  a y z 1 
2015-07-20  a b c 2 
2015-07-15  a y z 1 
2015-07-22  x b c 1 
2015-07-21  a b c 2 
2015-07-18  a y c 2 
2015-07-15  a y z 2 
2015-07-22  a y c 2 
2015-07-14  x b c 1 

мне нужно получить упорядоченный результат на колонке даты и времени T, но мне нужно, что запрос обнаруживает и избежать повторяющихся строк в столбцах A, B и C. И все это упорядочено и разделено идентификатором.

Это может быть хранимая процедура. Важно быть быстрым, потому что это огромная таблица журналов. С миллионами строк.

Результат должен быть таким:

T    A B C ID 
2015-07-22  x b c 1 
2015-07-19  a b c 1 
2015-07-17  a y c 1 
2015-07-15  a y z 1 
2015-07-14  x b c 1 
2015-07-22  a y c 2 
2015-07-19  a b c 2 
2015-07-17  a y c 2 
2015-07-15  a y z 2 

Любые идеи?

+0

Таблица имеет 20 индексированных столбцов, поэтому Я предпочитаю не группировать все эти столбцы ... если это возможно. – rasputino

+0

Как выглядит остальная часть вашего стола? Если это так, вы можете использовать 'SELECT DISTINCT * FROM mytable ORDER BY id, T' – vinz

+0

Я хочу обнаружить изменение между последовательными строками. Итак, в примере строки '2015-07-22 xbc 1' и' 2015-07-14 xbc 1' будут одинаковыми, если запрос «SELECT A, B, C, ID FROM mytable ORDER BY id, T '. И все строки будут отличаться от 'SELECT DISTINCT * FROM mytable ORDER BY id, T'because T отличается ... всегда. – rasputino

ответ

1

Этот запрос дает ожидаемый результат (проверено):

SELECT t1.* FROM mytable t1 
LEFT JOIN mytable t2 ON t1.t = t2.t + INTERVAL 1 DAY AND t1.A = t2.A AND t1.B = t2.B AND t1.C = t2.C AND t1.ID = t2.ID 
WHERE t2.T IS NULL 
ORDER BY t1.ID, t1.T DESC 
0

Попробуйте этот запрос:

SELECT * FROM table GROUP BY A,B,C,T ORDER BY ID, T 

Edit: добавлена ​​T в группе

+0

Я бы заменил 'T' на' MAX (T) ', чтобы выбрать последние. –

+0

Это не решает мою проблему. Потому что строки: 2015-07-22 x b c 1 2015-07-14 x b c 1 будет сгруппирован в одну строку. Мне нужно получить, когда строка изменится во времени ... что-то вроде исторического журнала изменений. – rasputino

+0

Отредактировано мое сообщение! – vinz

1

Попробуйте этот запрос:

SELECT max(t),a,b,c,id FROM table GROUP BY A,B,C,id ORDER BY ID, max(T) 
+0

Это не решает мою проблему. Потому что строки: 2015-07-22 x b c 1 2015-07-14 x b c 1 будет сгруппирован в одну строку. Мне нужно получить, когда строка изменится во времени ... что-то вроде исторического журнала изменений. – rasputino

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