LINUX.ORG.RU

Группировка по условия с выбором min и max.

 


0

2

Пусть есть таблица.

host  	up	time
------------------------------------------------------
ya.ru 	ok	2012-04-02 09:29:01 UTC
ya.ru 	ok	2012-04-02 09:30:01 UTC
ya.ru 	ok	2012-04-02 09:38:52 UTC
ya.ru 	ok	2012-04-02 09:39:53 UTC
ya.ru 	fail	2012-04-02 09:40:53 UTC
ya.ru 	ok	2012-04-02 09:41:58 UTC
ya.ru 	ok	2012-04-02 09:42:59 UTC
ya.ru 	ok	2012-04-02 09:43:59 UTC
ya.ru 	ok	2012-04-02 09:45:00 UTC
ya.ru 	ok	2012-04-02 09:46:00 UTC

Нужно сгруппировать по полю `up` и выбрать min и max даты. В итоге должно быть.

host  	up	time
------------------------------------------------------
ya.ru 	ok	2012-04-02 09:29:01 UTC
ya.ru 	ok	2012-04-02 09:39:53 UTC
ya.ru 	fail	2012-04-02 09:40:53 UTC
ya.ru 	ok	2012-04-02 09:41:58 UTC
ya.ru 	ok	2012-04-02 09:46:00 UTC

Заранее спасибо.


То, что ты текстом написал и итоговая таблица как-то не стыкуются.
Видимо я не понял, что ты хотел сказать.

pi11 ★★★★★
()
Ответ на: комментарий от pi11

Я не имел ввиду group by. Он не поможет :/

Мне нужна именно итоговая таблица. Или хотя бы такая:

host  	up	time
------------------------------------------------------
ya.ru 	ok	2012-04-02 09:29:01 UTC
ya.ru 	fail	2012-04-02 09:40:53 UTC
ya.ru 	ok	2012-04-02 09:41:58 UTC

Суть в том, чтобы выбрать временные промежутки, на которых хост работает (up) или лежит. Мне нужно хотя бы фиксировать время, в которое состояние менялось.

daris
() автор топика
Ответ на: комментарий от daris

Мне нужно хотя бы фиксировать время, в которое состояние менялось.

Может еще одну таблицу завести тогда?

pi11 ★★★★★
()
Ответ на: комментарий от pi11

Нежелательно, хотелось бы обновлять вывод без больших задержек.

Может схему текущей таблицы изменить? Никак не доберусь до серьёзного руководства по SQL.

daris
() автор топика
Ответ на: комментарий от pi11

Спасибо, тоже к пришёл к похожему решению. Интересно было бы взглянуть на запрос, решающий первоначальную задачу :)

daris
() автор топика
Ответ на: комментарий от daris
select t.host, t.up, t.time1, max(t.time2) as time2 from (select t1.host, t1.up, min(t1.time) as time1, t2.time as time2 from daris t1 inner join daris t2 on t1.host = t2.host and t1.up = t2.up and not exists (select time from daris where host = t1.host and if(t1.up = "ok", up = "fail", up = "ok") and time > t1.time and time < t2.time) group by t2.time) t group by t.time1;
+-------+------+---------------------+---------------------+
| host  | up   | time1               | time2               |
+-------+------+---------------------+---------------------+
| ya.ru | ok   | 2012-04-02 09:29:01 | 2012-04-02 09:39:53 |
| ya.ru | fail | 2012-04-02 09:40:53 | 2012-04-02 09:40:53 |
| ya.ru | ok   | 2012-04-02 09:41:58 | 2012-04-02 09:46:00 |
+-------+------+---------------------+---------------------+
3 rows in set (0.01 sec)
damnemall
()
Ответ на: комментарий от damnemall

Благодарю. Это огромное нечто, откровенно говоря, страшно писать :)

Если мой вариант будет тормозить (как обычно бывает), возьму этот. Вряд ли будет правильно использовать то, что не понимаешь)

daris
() автор топика
Ответ на: комментарий от daris

daris

Благодарю. Это огромное нечто, откровенно говоря, страшно писать :)

насколько я понимаю, это просто вариант с ещё одной двумя временными таблицами. Его можно переписать в более простом виде, и тогда будет более понятно.

drBatty ★★
()
Ответ на: комментарий от drBatty

Его можно переписать в более простом виде, и тогда будет более понятно.

Ну так приведи более простой вариант, тебе же легко это сделать. В однои топике ты браузеры легко ломаешь левой рукой, а тут правой рукой напиши более понятный запрос. Ты это сможешь. Я в тебя верю.

anonymous
()
Ответ на: комментарий от anonymous

anonymous

Ну так приведи более простой вариант, тебе же легко это сделать. В однои топике ты браузеры легко ломаешь левой рукой, а тут правой рукой напиши более понятный запрос. Ты это сможешь. Я в тебя верю.

мне лень.

но ссылочку я дам: http://www.mysql.ru/docs/man/ANSI_diff_Sub-selects.html

ЗЫЖ Браузеры я не ломаю, я в том топике говорил о том, что у многих _клиентов_ браузер может быть сломан, или его легко поломать. Т.е. не стоит рассчитывать на неуязвимость браузера _клиента_.

drBatty ★★
()
Ответ на: комментарий от drBatty

мне лень.

Терзают смутные сомнения, что писать 100 комментов в день тебе не лень, гуглить тебе не лень, а вот написать 1 (один) простой запрос, чтобы реально помочь человеку, тебе лень.

браузер может быть сломан, или его легко поломать.

Tell me more.

anonymous
()
Ответ на: комментарий от anonymous

anonymous

Терзают смутные сомнения, что писать 100 комментов в день тебе не лень, гуглить тебе не лень, а вот написать 1 (один) простой запрос, чтобы реально помочь человеку, тебе лень.

а в чём тут помощь? Ссылку на мануал я ему дал, к тому же этот запрос - не совсем то, что нужно ТСу. Кстати, если переписать, это будет совсем не один, и совсем не простой запрос для того, кто не знает SQL. Та же самая НЁХ, только записанная более длинно.

drBatty ★★
()
Ответ на: комментарий от drBatty

drBatty (03.04.2012 12:43:22): Его можно переписать в более простом виде, и тогда будет более понятно.

drBatty (04.04.2012 9:38:30) Кстати, если переписать, это будет совсем не один, и совсем не простой запрос

Дружище! Это — фейл!

anonymous
()
Ответ на: комментарий от anonymous

anonymous

Дружище! Это — фейл!

у тебя - да, конечно. Научись читать фразу до конца:

drBatty

...для того, кто не знает SQL.

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

Ещё узнай такую интересную вещь, что даже «сложный запрос» может быть «более понятен», если его переписать должным образом. Оно в жизни пригодится...

drBatty ★★
()
Ответ на: комментарий от drBatty

Сколько слов... а написать «простой запрос» ты так и не смог. Вот это и есть фейл №1. Фейл №2 это то, что ты не отвечаешь за свои слова. Но это и не удивительно.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.