Не получается запрос - просьба помочь
От: LowCoder  
Дата: 25.06.10 07:47
Оценка:
Прошу помочь вот с каким вопросом. Никак не могу построить SQL запрос в MySQL (хотя мне кажется конкретная платформа здесь не важна). Есть таблица с полями

id,
datetime,
value1 int,
value2 int,
value3 int


Каждый день в БД вносятся данные в хронологическом порядке (хронология по времени). На другой день тоже самое — например
1, 2010-05-10 12:03, 10, 20, 30
2, 2010-05-10 13:50, 15, 16, 45
3, 2010-05-10 18:15, 25, 48, 25
4, 2010-05-11 10:07, 09, 56, 32
5, 2010-05-11 14:20, 92, 89, 78
6, 2010-05-12 11:02, 14, 65, 38
7, 2010-05-12 11:05, 05, 11, 44


Мне нужно сделать выборку следующего вида
2010-05-10 18:15, 25, 48, 25
2010-05-11 14:20, 92, 89, 78
2010-05-12 11:05, 05, 11, 44

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

Запросы типа

SELECT max(datatime), value1, value2, value3 FROM tbl_test;

SELECT max(datatime), value1, value2, value3 FROM tbl_test GROUP BY date(datetime);

SELECT max(datatime), value1, value2, value3 FROM tbl_test GROUP BY date(datetime) ORDER BY datetime DESC;


не дают желаемого результата (и это расстраивает) . Возвращается вот что


          
             |------ самое поздее время в рамках одного дня 
             | 
2010-05-10<--| 18:15, 10, 20, 30 <-- НО! данные из ПЕРВОЙ записи внутри дня... 
2010-05-11 14:20, 09, 56, 32
2010-05-12 11:05, 11, 11, 44


Т.е нужно что то типа сортировки в обратом пордки ВНУТРИ групп (внутридневных групп) либо что типа функции last — котрая возвращала бы последнюю запись во внутредневном наборе.
У меня есть ощушение что это сделать можно одним запросом но видимо меня чета заклинило.
Буду очень признателен за ответ.
Re: Не получается запрос - просьба помочь
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 25.06.10 08:12
Оценка:
Здравствуйте, LowCoder, Вы писали:

LC>Прошу помочь вот с каким вопросом. Никак не могу построить SQL запрос в MySQL (хотя мне кажется конкретная платформа здесь не важна).


Еще как важна, так как в MSSQL есть оконные функции которые работают как раз так как вам надо. Но можно и без них, только запрос сложнее получится.
Пишу для MSSQL, извините если для MySQL не подойдет.

Select id, datatime, value1, value2, value3 FROM tbl_test
where datatime in(  SELECT max(datatime) FROM tbl_test GROUP BY date(datetime))


Если у вас несколько строк может быть с одним datetime, то вернутся все. Можно сделать, чтобы вернулась только одна, если это критично


Если у вас id строго возрастает, то можно и это использовать
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.