2016-02-16 5 views
-1

Как я могу иметь для каждого grp_id 2 строки: до и после строки текущей Отметки времени Unix,** MySql ** Выберите Перед После строки для каждой GroupID

 
+---------+--------------------+------------+-------+ 
| id  |    grp_id |  utimes | value | 
+---------+--------------------+------------+-------+ 
| 4156187 |    5282 | 1455663600 | 15897 | 
| 4159888 |    5282 | 1455630000 | 26998 |* 
| 4156190 |    5282 | 1455676200 | 28497 | 
| 4156186 |    5282 | 1455661800 | 14097 | 
| 4156183 |    5282 | 1455652800 | 5097 | 
| 4156184 |    5282 | 1455656400 | 8697 | 
| 4156185 |    5282 | 1455660000 | 12297 | 
| 4156182 |    5282 | 1455651000 | 3297 |* 
| 4163311 |    7216 | 1455693000 | 45297 | 
| 4163275 |    7203 | 1455681600 | 33897 | 
| 4163309 |    7214 | 1455697800 | 50097 | 
| 4163308 |    7214 | 1455696000 | 48297 | 
| 4163307 |    7214 | 1455694200 | 46497 | 
| 4163306 |    7214 | 1455692400 | 44697 | 
| 4163305 |    7214 | 1455690600 | 42897 | 
| 4163304 |    7214 | 1455688800 | 41097 | 
| 4151121 |    4356 | 1455703200 | 55497 | 
| 4163271 |    7205 | 1455685500 | 37797 | 
| 4163272 |    7205 | 1455687000 | 39297 | 
| 4163269 |    7205 | 1455684900 | 37197 | 
| 4163273 |    7205 | 1455687300 | 39597 | 
| 4163264 |    7206 | 1455674400 | 26697 | 
| 4163270 |    7205 | 1455685200 | 37497 | 
+---------+--------------------+------------+-------+ 
 
Example: 
unix-timestamp : 1455647703 
 
+---------+--------------------+------------+-------+ 
| id  |    grp_id |  utimes | value | 
+---------+--------------------+------------+-------+ 
| 4159888 |    5282 | 1455630000 | 26998 | 
| 4156190 |    5282 | 1455651000 | 28497 | 
| 4159889 |    XYZ | 1455630000 | 26998 | 
| 4156191 |    XYZ | 1455651000 | 28497 | 
| 4159883 |    ABC | 1455630000 | 26998 | 
| 4156195 |    ABC | 1455651000 | 28497 | 
+---------+--------------------+------------+-------+ 

Спасибо !

+1

просьба представить ожидаемый выход. и что вы уже достигли? – MaxU

+0

Я думаю, что правильный вывод - это тот, который отмечен звездочкой. Это означает, что вторая запись результата в конце неверна. –

+0

Что значит сказать: «до и после строки текущей временной отметки unix»? хотите ли вы иметь строки с минимальными и максимальными «утилями» для каждого «grp_id»? – MaxU

ответ

0

Вы можете сделать это с помощью операции LEFT JOIN. Предложение ON содержит 'бизнес-логики':

SELECT t1.* 
FROM mytable AS t1 
LEFT JOIN mytable AS t2 
    ON t1.grp_id = t2.grp_id 
     AND 
    ((t1.utimes < 1455647703 AND t2.utimes < 1455647703 AND t2.utimes > t1.utimes) 
     OR 
     (t1.utimes > 1455647703 AND t2.utimes > 1455647703 AND t2.utimes < t1.utimes)) 
WHERE t1.grp_id = 5282 AND t2.id IS NULL 

Demo here

+0

Спасибо за ваш ответ, отлично работает с grp_id = 5282 .. Но могу ли я применить это для всех различных grp_id? – c0rnw19

+0

@ c0rnw19 Да, вы можете. Просто опустите 't1.grp_id = 5282' из предложения WHERE. Проверьте [здесь] (http://sqlfiddle.com/#!9/71da9/5). –

+0

Большое спасибо. Но у меня около 100 000 строк, и это занимает очень много времени .. :( – c0rnw19

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

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