Sql查询以查找两个给定日期之间的视图百分比差异

Posted

技术标签:

【中文标题】Sql查询以查找两个给定日期之间的视图百分比差异【英文标题】:Sql query to find the percentage difference of views between two given dates 【发布时间】:2011-11-14 22:45:15 【问题描述】:

我正在尝试编写一个 sql 查询,但我发现了一些困难。我想要的是:

假设我们有一张表格,用于存储每天观看视频的次数。 比如:

天:14/11/2011,video_id:3539,观看次数:125 和:2011 年 11 月 15 日,video_id:3539,观看次数:162

(因此该表存储 video_id、day、timeswatched)

我想要的是制作一个广告牌/图表类型,显示日期之间(今天和昨天)观看次数最多的 8 个视频的观看时间百分比变化:今天和昨天。 (请注意,今天或昨天可能根本没有观看视频 - 这应该是一个问题吗?)

所以结果应该是这样的:video-id: 3539 今天有 +23% 或 -44%(或..)更多/更少的观看次数(我们需要知道如何找到 23%)

谢谢!

【问题讨论】:

拥有数据集后,您在 php 中的逻辑会更加实用。 谢谢,我想我同意这一点,但是 sql 查询应该是什么? 【参考方案1】:
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

【讨论】:

我明白了主要的想法,谢谢!它说“字段列表中的 1052 列 'idvideo' 不明确”,但我想这与我对代码所做的一些修改有关。无论如何,我会找到解决它的方法。非常感谢你的帮助! :) 我总是检查我用作解决此类问题的答案,只要给我一些时间根据所有解决方案进行“测试”,然后检查我所依赖的答案 :)【参考方案2】:
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'

【讨论】:

谢谢,但我们需要将其用于今天观看的前 8 个视频,而不是仅用于特定视频 然后获取该代码并以适当的方式对其进行修改。本网站的目的是让您询问如何做您不知道该怎么做的事情。你不能让其他人为你做你的工作。 如果我知道我会要求你修改它:P 但没关系。不管怎么说,还是要谢谢你! :) 最好的方法可能是在FROM 子句中用一个合适的子查询(查找今天观看次数最多的8 个视频)替换videoWatchCountToday【参考方案3】:

我会做类似(伪代码)的事情:

昨天 = sql('SELECT 从视频 WHERE DATE(date_field) = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)') today = sql('SELECT timeswatched FROM videos WHERE DATE(date_field) = CURRENT_DATE()') 如果(今天 == 0 || 昨天 == 0) // 特殊处理... 0 -> 10 个视图是无限增加的。 别的 返回 (100 * 昨天/今天) - 100;

【讨论】:

谢谢!它比其他解决方案简单得多,所以我也会检查一下。谢谢!

以上是关于Sql查询以查找两个给定日期之间的视图百分比差异的主要内容,如果未能解决你的问题,请参考以下文章

SQL:查找按用户分组的最新两个记录之间的差异

我正在尝试提高查找两个表之间差异的 Oracle SQL 的性能

sql查询计算不同列和相邻行的两个日期之间的差异

SQL查询以查找列的行值之间的最小差异

SQL Select 查询以选择日期之间的数据,其中从日期月份高于日期月份和年份差异>1

SQL 查询以查找给定日期之前的最后一次更改