2015-01-22 3 views
0

Я ищу, чтобы определить количество просмотров на инвестиции каждую неделю с даты создания до текущей даты. enter image description hereКол-во просмотров за неделю

Каждый раз, когда кто-то посещает инвестиции, я вставив его к столу с investment_id, user_id и timestamp(datetime).

Таблица выглядит следующим образом:

investment_id

 
investment_id user_id  Time_stamp 
499   233   2015-01-22 09:00:42 
499   256   2015-01-21 09:00:42 
499   275   2015-01-20 09:00:42 
499   233   2015-01-14 09:00:42 
499   233   2015-01-14 09:00:42 
499   233   2015-01-10 09:00:42 
499   273   2015-01-06 09:00:42 
499   347   2015-01-02 09:00:42 
499   343   2015-01-01 09:00:42 
499   344   2015-01-01 09:00:42 

Так investment_id 499, созданного на 2015-01-01 00:00:00, результат будет как показано ниже:

 
Week  Views 
1   4 
2   3 
3   2 
4   1 

Обнаружена работа вокруг:

SELECT (CASE (ceiling(datediff(Time_stamp,"2015-01-01 00:00:00")/7)) WHEN 0 THEN 1 
ELSE (ceiling(datediff(Time_stamp,"2015-01-01 00:00:00")/7)) END) as weeks, 
count(Investment_Id) as viewCount 
from log_table where Investment_Id =499 group by weeks 
+0

показать запрос, что вы пытались –

+0

у вас нет первичного ключа. Инвестиции 499 дважды просматривались пользователем 233. Это проблематично. – Strawberry

ответ

1

Необходимое временное/виртуальная таблица так:

+ ------------- + ---------- + ---------- + ---------- + 
| investment_id | week_start | week_end | weeknumber | 
+ ------------- + ---------- + ---------- + ---------- + 
| 499   | 2015-01-02 | 2015-01-09 | 1   | 
| 499   | 2015-01-09 | 2015-01-16 | 2   | 
| 499   | 2015-01-16 | 2015-01-23 | 3   | 
| 499   | 2015-01-23 | 2015-01-30 | 4   | 
+ ------------- + ---------- + ---------- + ---------- + 

Это может быть достигнуто с каким-то генерируют серию:

SELECT 
    499 investment_id, 
    @wstart := @startdate + INTERVAL @wseq * 7 DAY week_start, 
    @wend := @wstart + INTERVAL 7 DAY week_end, 
    @wseq := @wseq + 1 weeknumber 
FROM 
    information_schema.collations 
CROSS JOIN 
    (SELECT @startdate := (SELECT MIN(DATE(time_stamp)) 
    FROM log_table 
    WHERE investment_id = 499), @wseq := 0) u 
HAVING 
    week_start <= CURRENT_DATE 

перекрестное соединение должен инициировать пользователь переменные, с таблицей с достаточным количеством строк, вы можете генерировать ряды из этих пользовательских переменных. information_schema.collations всегда доступно и имеет более 200 строк.

Если вы поместите это в подзапрос, таблица с инвестиционными представлениями может быть объединена на investent_id и time_stamp между week_start и week_end.

Это приведет:

SELECT 
    s.weeknumber, 
    COUNT(v.user_id) views 
FROM 
    (
    SELECT 
     499 investment_id, 
     @wstart := @startdate + INTERVAL @wseq * 7 DAY week_start, 
     @wend := @wstart + INTERVAL 7 DAY week_end, 
     @wseq := @wseq + 1 weeknumber 
    FROM 
     information_schema.collations 
    CROSS JOIN 
     (SELECT @startdate := (SELECT MIN(DATE(start_date)) 
     FROM log_table 
     WHERE investment_id = 499), @wseq := 0) u 
    HAVING 
     weekstart <= CURRENT_DATE 
    ) s 
LEFT JOIN 
    log_table v 
    ON s.investment_id = v.investment_id 
    AND v.time_stamp >= s.week_start 
    AND v.time_stamp < s.week_end 
GROUP BY s.weeknumber 
0

что-то вроде этого?

select week(time_stamp), count(investment_id) 
group by time_stamp, investment_id 
0

Два варианта:

метод
  1. Используйте DatePart, чтобы получить неделю из колонки даты и времени, Однако это не даст вам ожидаемого результата, так как шестой не попадает в тот же календарь как 1-й и 2-й января, как показывает ваш вывод.

  2. Используйте «пользовательский» код, определяющий, что такое неделя, I.e. первая неделя находится между 1-й и 7-го числа каждого месяца и т.д.

Примеры для двух вариантов ниже,

удачи.

SELECT * 
    into #tmp 
    FROM  
    (
    select 499 investment_id,   233 user_id,   '2015-01-22 09:00:42' Time_stamp 
     union all 
    select 499,   256,   '2015-01-21 09:00:42' 
     union all 
    select 499,   275,   '2015-01-20 09:00:42' 
     union all 
    select 499,   233,   '2015-01-14 09:00:42' 
     union all 
    select 499,   233,   '2015-01-14 09:00:42' 
     union all 
    select 499,   233,   '2015-01-10 09:00:42' 
     union all 
    select 499,   273,   '2015-01-06 09:00:42' 
     union all 
    select 499,   347,   '2015-01-02 09:00:42' 
     union all 
    select 499,   343,   '2015-01-01 09:00:42' 
     union all 
    select 499,   344,   '2015-01-01 09:00:42' 
    ) a 


    Select DATEPART(wk,Time_stamp) week , count(investment_id) 
    FROM #tmp 
    group by DATEPART(wk,Time_stamp) 


SELECT b.WeekNumber , count(b.investment_id) 
FROM (
    SELECT a.* , 
     case 
      when a.DayInMonth between 1 and 7 then 1 
      when a.DayInMonth between 8 and 14 then 2 
      when a.DayInMonth between 16 and 22 then 3 
      when a.DayInMonth between 23 and 29 then 4 
      else 5 
     end as WeekNumber    
    FROM (
     Select day(Time_stamp) DayInMonth , * 
     FROM #tmp 
    ) a 
)b 
group by b.WeekNumber 
+0

Является ли второе заявление тем, что вы ищете? –

+0

Я не был ясно о неделе, я думаю.Если дата создания - 10 января, то к первой неделе я имел в виду 10-17 января, вторая неделя означает 18-24 января и т. Д. – puppuli

+0

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

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