Запрос Sql, чтобы найти разницу в процентах просмотров между двумя данными датами - PullRequest
0 голосов
/ 15 ноября 2011

Я пытаюсь написать SQL-запрос, но я нахожу некоторые трудности. Я хочу:

Предположим, у нас есть таблица, в которой мы храним время просмотра видео за день. Так, например:

  • день: 14.11.2011, video_id: 3539, время просмотра: 125
  • и: 15/11/2011, video_id: 3539, время просмотра: 162

(поэтому таблица хранит video_id, day, timeswatched)

То, что я хочу, - это создать рекламный щит / тип диаграммы, который будет отображать процентное соотношение времени просмотра 8 самых популярных (на сегодня) видео между датами: сегодня и вчера. (обратите внимание, что видео, возможно, вообще не смотрели сегодня или вчера - это должно быть проблемой или нет?)

Таким образом, результат должен быть примерно таким: video-id: 3539 имеет + 23% или -44% (или ..) больше / меньше просмотров сегодня (нам нужно знать, как найти 23%)

Спасибо!

Ответы [ 3 ]

1 голос
/ 15 ноября 2011
Select Top8.idvideo, (vtoday.times - vyesterday.times) / vtoday.times
From 
  (select 
     Idvideo from Nviews 
     Where day = Curdate()
   order by watches desc limit 8) top8 
  Inner join
   NViews vtoday 
       on vtoday.day = curdate()
       and vtoday.idvideo=top8.idvideo
  Left outer join
    NViews vyesterday
       On vyesterday.day= Date_add( curdate(), interval -1 day) and
           Vyesterday.idvideo = top8.idvideo
0 голосов
/ 15 ноября 2011

Я бы сделал что-то вроде (псевдокод):

yesterday = sql('SELECT timeswatched  FROM videos WHERE DATE(date_field) = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)')
today = sql('SELECT timeswatched  FROM videos WHERE DATE(date_field) = CURRENT_DATE()')

if (today == 0 || yesterday == 0)
  // Special handling... 0 -> 10 views is an infinite increase.
else
  return (100 * yesterday / today) - 100;
0 голосов
/ 15 ноября 2011
SELECT
    videoWatchCountToday.timeswatched AS timeswatchedtoday,
    videoWatchCountYesterday.timeswatched AS timeswatchedyesterday,
    CASE
        WHEN COALESCE(videoWatchCountYesterday.timeswatched, 0) = 0 THEN NULL
        ELSE ROUND(100 * (videoWatchCountToday - videoWatchCountYesterday) / videoWatchCountYesterday, 0)
    END AS change
FROM
    videoWatchCount AS videoWatchCountToday
    LEFT JOIN videoWatchCount AS videoWatchCountYesterday ON
        videoWatchCountToday.video_id = videoWatchCountYesterday.video_id AND
        videoWatchCountYesterday.day = '2011-11-14'
WHERE
    videoWatchCountToday.video_id = 3539 AND
    videoWatchCountToday.day = '2011-11-15'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...