Выбор строк с максимальным значением в диапазоне

У меня есть данные followng:

+----+---------+---------------------+-------+
| id | site_id | datetime | views |
+----+---------+---------------------+-------+
| 1 | 1 | 2013-11-01 23:59:59 | 12 |
| 2 | 1 | 2013-11-02 23:59:59 | 15 |
| 3 | 1 | 2013-11-03 23:59:59 | 18 |
| 4 | 1 | 2013-11-04 23:59:59 | 29 |
| 5 | 1 | 2013-11-05 23:59:59 | 38 |
| 6 | 1 | 2013-11-05 12:59:59 | 40 |
| 7 | 1 | 2013-11-06 23:59:59 | 45 |
| 8 | 1 | 2013-11-07 23:59:59 | 49 |
| 9 | 1 | 2013-11-08 23:59:59 | 52 |
| 10 | 2 | 2013-11-04 23:59:59 | 25 |
| 11 | 2 | 2013-11-05 21:59:59 | 42 |
| 12 | 2 | 2013-11-06 23:59:59 | 60 |
| 13 | 2 | 2013-11-07 23:59:59 | 75 |
| 14 | 2 | 2013-11-08 23:59:59 | 86 |
| 15 | 2 | 2013-11-09 23:59:59 | 90 |
| 16 | 2 | 2013-11-10 23:59:59 | 92 |
| 17 | 2 | 2013-11-11 23:42:59 | 98 |
+----+---------+---------------------+-------+

Я пропустил бы день и хотел бы получить строки с самым высоким временем в данный день или если нет записей для этого сайта на этот день, последней доступной строки в прошлом.

например, для 2013-11-01

+----+---------+---------------------+-------+
| id | site_id | datetime | views |
+----+---------+---------------------+-------+
| 1 | 1 | 2013-11-01 23:59:59 | 12 |
+----+---------+---------------------+-------+

на 2013-11-05

+----+---------+---------------------+-------+
| id | site_id | datetime | views |
+----+---------+---------------------+-------+
| 5 | 1 | 2013-11-05 23:59:59 | 38 |
| 11 | 2 | 2013-11-05 21:59:59 | 42 |
+----+---------+---------------------+-------+

и на 2013-11-10

+----+---------+---------------------+-------+
| id | site_id | datetime | views |
+----+---------+---------------------+-------+
| 9 | 1 | 2013-11-08 23:59:59 | 52 |
| 16 | 2 | 2013-11-10 23:59:59 | 92 |
+----+---------+---------------------+-------+

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

4 ответа

Вы можете попробовать следующее:

SELECT a.id,a.site_id,b.maxDate,a.views
FROM table1 a
INNER JOIN (
 SELECT site_id ,MAX(datetime) as maxDate
 FROM table1
 WHERE datetime < DATEYOUWANTTOSEE + INTERVAL 1 DAY
 GROUP BY site_id
) b ON a.site_id = b.site_id AND a.datetime = b.maxDate

Внутренний запрос получит вам MAX (datetime) для каждого сайта site_id. Затем вы присоединитесь к нему со своим столом, чтобы получить остальную информацию.

sqlfiddle demo


SELECT * FROM <tablename> WHERE datetime = <datetime> ORDER BY datetime DESC LIMIT 2
</datetime></tablename>


Я считаю, что это должно работать:

SELECT SUBSTRING('datetime', 1, 10) AS date, MAX('views')
FROM table
GROUP BY SUBSTRING('datetime', 1, 10)

Если вам нужен id/site_id, напишите его в своем посте, так как не понятно

SQLFiddle, чтобы показать вам результат: http://sqlfiddle.com/#!2/e0ccb3/1


Ваши данные и примеры действительно не соответствуют самим себе, ни описанию, но то, что вы, вероятно, ищете, таково:

Select top 1 * 
 from table
 where date(datetime) <= date(@PARAMETER)

упорядочить по дате

licensed under cc by-sa 3.0 with attribution.