SELECT命令用于计算百分比

时间:2009-11-19 15:13:51

标签: mysql sql count sum

我正在尝试根据其对所有其他视频的观看次数来获取我的数据库中每个视频的百分比。

然后我尝试将所有视频从最高视图数量显示到最低,在一个漂亮的HTML页面中显示其百分比。

显然,百分比的范围是0 - 100%(而不是结束),最受欢迎的视频可能会有100%的假设..

我在数据库中有大约3,400个视频。我的尝试是可笑的,现在已经摸不着头几天了。

我的表看起来与此类似。

video_public
id | video_title | video_views

尝试:

SELECT 
   id, 
   video_views * 100 / (SELECT COUNT(*) FROM video_public)
FROM `video_public` stat

老实说,我甚至不知道这个SQL查询是否正确。

我甚至没有考虑针对所有视频观看总视频视频观看次数 ..

真的卡住了..

11 个答案:

答案 0 :(得分:6)

好的,基于您的问题的澄清:

您想为数据库中的每个视频计算(video_views * 100)/(largest_views_for_any_single_video)。

分子很简单,它只是video_views列。分母是

SELECT MAX(video_views) FROM video_public

所以,把它放在一起,你得到:

SELECT video_title, ((video_views * 100) / (SELECT MAX(video_views) 
FROM video_public)) FROM video_public

对于观看次数最多的视频,这应该会产生100,而对于其他视频,这应该会产生较低的百分比,对于任何从未观看过的视频都会减少到0。

答案 1 :(得分:5)

要修改绵羊模拟器建议的内容,您可以尝试:

SELECT 
    id, 
    video_title, 
    video_views, 
    (select sum(video_views) from video_public)) as TotalViews,
    ((100 * video_views)/(select sum(video_views) from video_public)) as PercentOfViews
FROM 
    video_public 
order by 
    video_views.

当然,改变排序以满足您的口味。

答案 2 :(得分:3)

好吧,我首先考虑一下你在寻找什么:

  

我在数据库中根据其对所有其他视频的观看次数而拥有的每个视频的百分比。

基本上,您希望首先找到查看排名。为什么不根据视频观点对记录进行排序:

SELECT id, video_title, video_views
FROM video_public order by video_views DESCENDING

现在,我认为这是你想要做的,只是展示其中的一部分,比如前10%?您希望然后为每个记录分配百分位数。这意味着,对于您已分配给视频的排序,您希望将“顶行”(返回的第一行)设为100%,最后一行返回0%。它为结果集中的每个项目提供0到100之间的数字。

计算你的百分位数:

SELECT id, 
       video_title, 
       video_views, 
       ((video_views * 100) / (select max(video_views) from video_public)) video_percentile
FROM video_public order by video_views DESCENDING

如果您只想显示前10%,请尝试以下方法:

SELECT id, 
       video_title, 
       video_views, 
       ((video_views * 100) / (select max(video_views) from video_public)) video_percentile
FROM video_public
WHERE ((video_views * 100) / (select max(video_views) from video_public)) > 90
ORDER BY video_views DESCENDING

目前还不完全清楚你在寻找什么,但我认为这可能会有所帮助。


修改 在查看了评论,特别是Riven和Larry Lustig之后,重新阅读了这个问题,我不得不说video_views的sum()是不正确的,所以我回去并将sum()更改为max( )秒。这将根据最常查看的视频给出一个百分比。

答案 3 :(得分:1)

我认为最好在脚本中计算百分比,然后从数据库中检索视图计数。

答案 4 :(得分:1)

运行两个选择:

 select max(video_views) FROM video_public

获取最大视图数,然后运行其他选择并计算脚本中的百分比。否则,子选择可能会针对每个结果行运行...这不是您想要的,性能明智。

另请注意,您必须使用max,而不是sumcount(*),因为您想知道“与我最常观看的视频相比,观看此视频的频率”。想象您每次观看一次视频和两次视频。百分比是多少? 100%?或0.0000001%?

答案 5 :(得分:1)

select id, ((video_views * 100) / (select sum(views) from videos)) view_percent   from video_public

这将为您提供每个视频的总观看次数的百分比。

答案 6 :(得分:1)

试试这个,现在可以在MySQL中使用。

select id, video, views, ((views / (select sum(views) from video)) * 100) as Percentagess
from video

这是表格:

CREATE TABLE IF NOT EXISTS `video` (
  `ID` int(11) NOT NULL,
  `Video` varchar(50) NOT NULL,
  `Views` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dumping data for table `video`
--

INSERT INTO `video` (`ID`, `Video`, `Views`) VALUES
(1, 'Hulk', 20),
(2, 'Jack', 30),
(3, 'The King', 24);

以下代码适用于SQL Server:

这是一个带有我刚写的临时表的游标。

声明@total int 设置@total =(从视频中选择总和(视图))

declare @videoid int
declare @video varchar(50)
declare @views int

declare @percentage decimal(18, 2)


IF  EXISTS (SELECT * FROM tempdb.sys.tables WHERE NAME LIKE '%tmp%')
DROP TABLE #tmp


--create temporary table
CREATE TABLE #tmp (VideoID int, VideoTitle varchar(50), Views int, Percentage decimal(18, 2))

DECLARE @videoPercent CURSOR
SET @videoPercent = CURSOR FOR 
    select id, video, views
    from video

OPEN @videoPercent

FETCH NEXT FROM @videoPercent INTO @videoid, @video, @views
WHILE @@FETCH_STATUS = 0
begin

    set @percentage = (convert(decimal(18,2), @views) / convert(decimal(18,2), @total)) * 100; 

    insert into #tmp(VideoID, VideoTitle, Views, Percentage)
    values(@videoid, @video, @views, @percentage);

    FETCH NEXT FROM @videoPercent INTO @videoid, @video, @views
end

select * from #tmp

CLOSE @videoPercent
DEALLOCATE @videoPercent

这是表格:

CREATE TABLE [dbo].[Video](
    [ID] [int] NOT NULL,
    [Video] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [Views] [int] NOT NULL
)

填写数据,你准备好了。尽情享受。

答案 7 :(得分:1)

如果您想在1个查询中计算百分比,请使用:

SELECT `vp1`.`id`, `vp1`.`video_views` * 100 / (SELECT MAX(`vp2`.`video_views`) FROM video_public AS `vp2`) FROM video_public AS `vp1`

当然,将中间结果存储在PHP(或SQL变量)中并将其传递给下一个查询会更有效

$phpmax <= SELECT MAX(`vp2`.`video_views`) FROM video_public AS `vp2`
SELECT `vp1`.`id`, `vp1`.`video_views` * 100 / {$phpmax} ) FROM video_public AS `vp1`

==&GT;在查询中使用SUM(视图)的每个人都有错误的结果!!排名最高的视频应该是100%,而不是所有视频合计的观看次数的百分比,因此您必须使用MAX(观看次数)

答案 8 :(得分:0)

要记住的事情......到目前为止,所有答案都包含子查询,我认为这些子查询是不必要的。这些将在表中的每一行进行评估!

而是在外部执行此操作,例如

而不是:

select id, ((video_views * 100) / (select sum(views) from videos)) view_percent
from video_public

这样做:

declare @totalviews int
select @totalviews = sum(views) from videos

select id, (video_views * 100 / @totalviews) view_percent
from video_public

这应该运行得更快,对数据库的影响更小。

答案 9 :(得分:0)

除非只能观看您的一个视频,否则您不会以100%观看观看次数最多的视频,但它会为您提供观看次数,此视频在所有观看次数上的比率以及此次的百分比已被查看与所有视频相比。


SELECT 
    Videos.id                     AS VideoID,
    video_views                   AS ViewCount,
    video_views / Total.ViewCount AS ViewRatio,
    Convert(varchar(6),Round(100.00 * video_views / Total.ViewCount, 2)) + '%' AS ViewPercentage
FROM 
    video_public AS Videos
CROSS JOIN 
    (SELECT Convert(float,Sum(video_views)) AS ViewCount FROM video_public) AS Total
ORDER BY
    video_views DESC

答案 10 :(得分:0)

实现此目的的最简单方法实际上是两个单独的查询。我同意Stuart的观点,子查询会对数据库性能产生负面影响,因为子查询将针对返回的每条记录运行。

我要做的是运行查询以获取总视频视图并将结果存储在本地变量中。

SELECT SUM(video_views) FROM VIDEO_PUBLIC
如果您想查看所有总观看次数的百分比

SELECT MAX(video_view) FROM VIDEO_PUBLIC
如果您想要查看相对于最受欢迎视频的百分比。

接下来,运行查询以获取视频,按大多数观看次序排序:

SELECT id, video_title, video_views FROM VIDEO_PUBLIC ORDER BY video_views DESC

然后在代码中,您可以在循环查看第二个查询的结果时,使用第一个查询的结果计算每个视频的浏览百分比。

我不确定您使用的是哪种语言用于显示,但在C#中它看起来像这样:

int totalViews = FirstQuery();
IEnumerable<Videos> videos = SecondQuery();
foreach (Video video in videos) {
    double totalPercentage = ((double)video.Video_Views / (double)totalViews) * 100)
}