2009-11-19 5 views
2

Я пытаюсь получить процентное соотношение каждого видео, которое у меня есть, в базе данных на основе его количества просмотров против всех других видео.Команда SELECT для вычисления процента

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

Очевидно, что процент будет составлять от 0 - 100% (а не более), а самого популярного видео, вероятно, 100% я предполагаю ..

У меня есть около 3400 видео в базе данных. Мои попытки смехотворны и уже несколько дней царапают мою голову.

Мой стол выглядит примерно так.

video_public 
id | video_title | video_views 

Попытка:

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

Честно говоря, я даже не знаю, если это SQL-запрос правильно.

Я даже не принимать во внимание Видео взгляды против все виды видео и всего видео ..

действительно застрял ..

+0

Я не понимаю, что вы ищете, и я не уверен, что вы либо потому, что говорите: «Самое популярное видео, вероятно, будет иметь 100% * я предполагаю *». Похоже, вы хотите выразить количество просмотров каждого видео в процентах * по сравнению с количеством просмотров самого популярного видео ». Это правильно? –

+0

Larry Lustig, Это верно. – BeaversAreDamned

+0

Очень хорошо, я разместил a ниже. –

ответ

6

Хорошо, основанный на выяснении вашего вопроса:

Вы хотите к расчетному (video_views * 100)/(most_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 за все, что никогда не просматривалось.

+0

Это то, что я ищу. Я даже не думал о синтаксисе MAX! Однако я отдал бы должное sheepsimulator, так как он, казалось, взломал большую часть его. Но с точки зрения того, что мне нужно. Это определенно ударило его домой. Kudos. – BeaversAreDamned

1

Я думаю, что лучше рассчитать ваш процент в вашем скрипте и просто возвращайте количество просмотров из базы данных.

+2

Я бы поехал по этому маршруту, если бы я действительно не был уверен в своих навыках SQL, но я чувствую, что они хороши для совершенствования. Обычно, если вы делаете материал с базами данных, хотя, имея в базе данных математику для вас и ограничение передачи больших объемов данных может окупиться в будущем. –

+0

Я бы предпочел рассчитать его с помощью SQL, но потом я смогу более эффективно управлять всем. – BeaversAreDamned

+0

Почему вы можете (возможно) получить эту информацию в той же самой команде SQL, которую используете для извлечения отсчетов с добавлением, возможно, 60 символов текста. Если он инкапсулирован как представление, тогда эта информация будет доступна любому читателю базы данных. Зачем писать дополнительные процедуры и оценить результаты в одном приложении? –

3

Ну, я бы начать думать о том, что your'e ищет:

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

В принципе, вы хотите найти его посмотреть ранг первый. Почему бы не сортировать записи на основе просмотров видео:

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

Теперь, и я думаю, что это то, что вы хотите сделать, это показать только часть из них, скажем, топ 10%? Затем вы хотите присвоить каждой из своих записей процентиль. Это означает, что для заказа, который вы назначили для видео, вы хотите, чтобы «верхняя строка» (первая возвращалась) давалась 100%, а последняя строка возвращалась 0%. Он дает число от 0 до 100 к каждому элементу в вашем наборе результатов.

your'e процентиль вычисляется:

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 

Это не совсем понятно, что вы» я ищу, но я думаю, что это может быть полезно.


EDIT: После просмотра замечаний, в частности, Ривен-х и Ларри Люстиг, и перечитывая этот вопрос, я должен был бы сказать, что сумма() из VIDEO_VIEWS неверен, поэтому я вернулся и изменил сумму() s на max() s. Это даст вам процент, основанный на просмотренном видео.

+0

Но это не даст вам никакого процента. Просто порядок большинства просмотров или меньше, в зависимости от вашего сортировки. – Ben

+0

Верно, я добираюсь туда. –

+0

Done ............ –

1

Выполнить два выбирает:

select max(video_views) FROM video_public 

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

Также обратите внимание, что вы должны использовать max, а не sum или count(*), так как вы хотите знать, «как часто это видео просматривалось по сравнению с тем, которое я смотрел больше всего». Изображения вы смотрели каждое видео один раз и один дважды. Какой процент будет? 100%? Или 0,0000001%?

+0

Для других ответов это утверждение не имеет смысла: «самое популярное видео, вероятно, будет на 100%, я предполагаю ..», но для этого ответа он делает. – Tim

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

Это даст вам, какой процент от общего количества просмотров имеет каждое видео.

+0

Не забудьте, что TSQL будет округлять целое число/целое число до целого. – Broam

+0

Этот вопрос - MySQL. –

5

Чтобы изменить то, что sheepsimulator предлагает, вы можете попробовать:

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. 

Изменить заказ в соответствии с вашими вкусами, конечно.

+0

Sheepsimulator не добавил расчетное поле на конце, но когда я разместил это, но он прав. – peacedog

+0

Я бы предложил сделать процентное вычисление в промежуточном программном обеспечении (php?); разум должен был использовать РСУБД только для того, чтобы данные и промежуточное ПО работали над визуализацией. , но я думаю, что это также вопрос личных предпочтений. –

+0

Я бы не стал спорить с этим, Стив. Это также будет зависеть от того, что я делал. Если это был запрос отчета о прогулке (или я очень спешил, чтобы это было готово для кого-то, на что можно было бы посмотреть), я бы, вероятно, сделал это в базе данных. Если бы я добавлял это в один из наших опубликованных отчетов, мы бы генерировали данные в ночное время и аккуратно хранили в таблице, хранящей данные о видо, о которых мы хотели сообщить (у нас пока нет хранилища данных как такового). Если бы я работал в этом приложении, я бы, вероятно, сделал бизнес-уровень. – peacedog

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 
) 

Заполните его с данными и и готовы идти. Наслаждайся.

+0

Это будет работать с MySQL? –

+0

Мне жаль об этом. Это может быть полезно кому-то еще надеяться. – Tebo

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 

Это должно работать быстрее, и имеют меньшее влияние на вашу базу данных.

+0

Является ли этот MySQL совместимым? Это выглядит очень много, как TSQL. –

+0

Извините ... это TSQL. У меня есть опыт работы в TSQL, но я думаю, что проблема достаточно общая, чтобы ее можно было легко перевести. На самом деле, я только видел тег MySQL после комментирования. Посмотрите на теги правильно, прежде чем отвечать снова. Сожалею! – Stuart

+0

Благодарим за попытку сделать это в любом случае. Я ценю вашу помощь. – BeaversAreDamned

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 
0

Самый простой способ сделать это на самом деле два отдельных запросов. Я согласен с Стюартом в том, что подзапросы окажут негативное влияние на производительность базы данных, потому что подзапрос будет запущен для каждой возвращенной записи.

Что бы я сделал, это запустить запрос, чтобы получить общее представление видео и сохранить результат в локальной переменной.

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) 
} 
1

Если вы хотели бы вычислить процент в 1 запрос, использование:

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

Ofcourse было бы гораздо более эффективным для сохранения промежуточного результата в 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` 

==> Все, кто использует SUM (представления) в запросе, имеют неправильные результаты !! Самый высокий рейтинг видео должно привести к 100%, а не процент от количества просмотров всех видео вместе взятых, поэтому вы должны использовать MAX (просмотров)

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