2012-06-29 5 views
1

Я пытаюсь сделать запрос, чтобы получать часы пик каждый день в конкретный месяц. В таблице у меня выглядит следующим образом:Стол Rush Hour для каждого дня в месяц MySQL

id  idproduct  created_at 
1  021354684  2011-10-01 20:25:48 
2  033546835  2011-10-01 20:30:15 
3  055965654  2011-10-01 20:45:20 
4  012975343  2011-10-02 14:03:36 
5  021354684  2011-10-02 15:55:48 
6  033546835  2011-10-02 16:30:15 
7  055965654  2011-10-02 16:45:20 
8  012975343  2011-10-02 18:53:36 
9  021354684  2011-10-03 08:55:48 
10  033546835  2011-10-03 09:30:15 
11  055965654  2011-10-03 14:03:20 
12  012975343  2011-10-03 14:03:36 

То, что я пытаюсь получить что-то вроде этого ...:

day  rush_hour number_of_rows 
1  20:00  3 
2  16:00  5 
3  14:00  4 

Можно ли получить таблицу, как это? Можете ли вы, ребята, помочь мне?

Я сделал ошибку, извините за это. Количество строк должно быть общее количество проданных товаров в тот же день, а не в тот час :(жаль

+1

Итак, вы хотите сгруппировать созданный_айт днем ​​и часами? Есть ли таймфрейм, например, с 1 до 2 часов, с 2 до 3 часов, ...? – Chris

+0

Существует нет, но было бы полезно иметь один, как 1am до 2am hehe – Nathre

ответ

3

http://sqlfiddle.com/#!2/5b87b/7

Во-первых, рассчитывать каждый час, в счет каждого дня (в целях, потому что мы будем использовать его в два раза ниже):

CREATE VIEW hours AS 
SELECT 
    DATE(created_at) AS d, 
    HOUR(created_at) AS h, 
    COUNT(*) AS c 
FROM item 
GROUP BY DATE(created_at), HOUR(created_at); 

Окончательный запрос:

SELECT 
    hours.d AS `day`, 
    hours.h AS `rush_hour`, 
    hours.c AS `count` 

-- get the max count for every day 
FROM (
     SELECT 
     d,   -- the day 
     MAX(c) as c -- the count 
     FROM hours 
     GROUP BY d 
    ) AS maxc 

-- find the actual hour(s) with the max count for every day: 
INNER JOIN hours ON hours.c = maxc.c 
       AND hours.d = maxc.d; 
+0

Конечно, вы можете скопировать-вставить выбор вида во второй запрос, если хотите. – biziclop

+0

Большое вам спасибо. Он работает префектом! Единственное, что я получаю 355 дней в году. Но это работает :) – Nathre

+0

Если вы хотите пронумеровать строки, это может помочь: http://sqlfiddle.com/#!2/5b87b/11 – biziclop

0

Попробуйте это:.

SELECT dayofyear(created_at) as day, hour(created_at) as rush_hour, count(*) as number_of_rows 
FROM table 
GROUP BY dayofyear(created_at), hour(created_at); 
2

Вы собираетесь хотеть смотреть на MySQL Date Functions, они предлагают вы некоторую помощь с этим

SELECT 
    day(created_at) as day, 
    hour(created_at) as rush_hour, 
    count(1) as num_rows 
FROM item 
GROUP BY 
    day(created_at), hour(created_at) 

http://sqlfiddle.com/#!2/62a15/2/0

0

Здесь, не делая вид:

SELECT ddd.day, eee.rush_hour, ddd.maxo 
FROM 
(select day, max(num_rows) as maxo from (
SELECT 
    day(created_at) as day, 
    hour(created_at) as rush_hour, 
    count(1) as num_rows 
FROM item 
GROUP BY 
    day(created_at), hour(created_at) 
) as groupo group by day) as ddd 

LEFT JOIN 
(SELECT 
    day(created_at) as day, 
    hour(created_at) as rush_hour, 
    count(1) as num_rows 
FROM item 
GROUP BY 
    day(created_at), hour(created_at) 
) as eee on ddd.day=eee.day and ddd.maxo=eee.num_rows 

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

И спасибо SQLfiddlers за размещение данных там.

И я думаю, что если у вас есть два часа, привязанных к самому большому количеству того, что вы считаете, они оба появятся, поэтому вы получите две (или более) записи, возвращенные в тот день месяца ,

+0

Это работает очень хорошо, но я не знаю, какой месяц это делает. Я получаю 31 день и результаты. Ты за свою помощь! – Nathre

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