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查询以查找两个给定日期之间的视图百分比差异的主要内容,如果未能解决你的问题,请参考以下文章
我正在尝试提高查找两个表之间差异的 Oracle SQL 的性能