2013-11-25 4 views
1

У меня есть 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 | 
+----+---------+---------------------+-------+ 

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

например. для 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 | 
+----+---------+---------------------+-------+ 

Спасибо заранее.

+1

Ваш пример 2013-11-10 неправильно. Просто удалите его. – Ultimater

ответ

5

Вы можете попробовать это:

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

+0

Я бы использовал 'WHERE datetime

+0

@ypercube. Я думаю, что это очень хорошее дополнение. –

-2

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

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

Если вам нужен идентификатор/site_id, а также, написать его в должности, поскольку не ясно

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

+0

SQLfiddle не работает, поэтому я не могу показать его в «живой» среде. – nrathaus

+0

OP хочет «GROUP BY site_id», а не 'GROUP BY DATE (datetime)' (и использование строковых функций не является лучшей практикой, когда есть функции datetime доступно.) –

+0

Благодарим вас за комментарий, где он написал, пожалуйста, сгруппируйте его по адресу site_id? – nrathaus

-1
SELECT * FROM <tablename> WHERE datetime = <datetime> ORDER BY datetime DESC LIMIT 2 
+0

Я думаю, что он ищет немного более общий оператор, т. е. он не знает значения datetime, он хочет собрать все из них. – nrathaus

+0

это запрос mysql, и синтаксис, который я написал, верен, ok – uvais

+0

Это не даст ему max datetime для каждого идентификатора. Это даст ему две записи с самой большой датой в этот день. И если нет записей за этот день, результаты не дадут. –

-2

вы данные и примеры на самом деле не соответствуют себя, ни описание, но то, что вы, вероятно, ищете это:

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

упорядочить по алфавиту даты и времени

+0

Ваш отступ немного сбит. – nrathaus

+0

Он помечен MySQL – Strawberry

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