Я думал об этом методе оценки хвоста:
для списка тегов,
за каждый вопрос в этих тегах
дать 1-й месяц после создания_даты 80% от View_Count
дать 2-й месяц после создания_даты 10% от View_Count
разделить 10% поровну между оставшимися месяцами до сегодняшнего дня
конечно 80%, 10% - это только мой выбор, они могут быть более точно рассчитаны на основе реальных данных. Также за второй месяц 10% могут быть исключены. Вся эта логика в: CASE WHEN diff ...
части.
Вы получаете приблизительное количество просмотров / вопрос / месяц
тогда все, что вам нужно сделать, это сумма view_count в месяц и, если вы хотите, чтобы окно времени добавляло условие для месяца
Я создал хранимую процедуру, которая может сделать это, но сначала нужно создать временную таблицу #tags (Tag_name), в которую вы поместите нужные теги.
CREATE PROCEDURE GetTagViews @startDate datetime, @endDate datetime
As
IF exists (SELECT null FROM sysobjects WHERE name = '#months' and type = 'U')
DROP TABLE #MONTHS
CREATE TABLE #MONTHS
(
month datetime
)
DECLARE @currMonth datetime
SELECT @currMonth = MIN(Creation_Date) FROM Questions
-- Populate #MONTHS with all the months from the oldest
-- question creation_date to Today
WHILE @currMonth < getdate()
BEGIN
-- insert date starting at the beginning og the month
INSERT INTO #MONTHS select @currMonth - day(@currMonth) + 1
SELECT @currMonth = dateadd(m, 1, @currMonth) -- advance 1 month
END
SELECT YEAR(month) y, MONTH(month) m, SUM(curr_month_views) Views FROM (
SELECT Q1.month, Q1.diff, round(
CASE WHEN diff = dmin and diff = dmax THEN View_Count
WHEN diff = dmin and diff < dmax THEN 0.8*View_Count
WHEN diff = dmin+1 and diff < dmax THEN 0.1*View_Count
WHEN diff = dmin+1 and diff = dmax THEN 0.2*View_Count
WHEN diff >= dmin+2 THEN 0.1/(dmax - (dmin+2) + 1)*View_Count
ELSE 0
END, 0) curr_month_views
FROM (
SELECT Q.question_id, m.month,
DATEDIFF(m, Q.Creation_Date, m.month) diff,
Q.View_Count, dmin, dmax
FROM Questions Q,
#MONTHS m,
(SELECT MIN(DATEDIFF(m, Q.Creation_Date, m.month)) [dmin],
MAX(DATEDIFF(m, Q.Creation_Date, m.month)) [dmax]
FROM Questions Q,#MONTHS m
WHERE DATEDIFF(m, Q.Creation_Date, m.month) >= 0) MINMAX
) Q1 join QuestionTags QT on Q1.question_id = QT.question_id
join #tags on #tags.Tag_Name = QT.Tag_Name
) b WHERE month >= @startDate - day(@startDate) + 1
AND month <= @enddate - day(@enddate) + 1
GROUP BY Year(month), Month(month)
ORDER BY 1, 2
Если я запускаю эту процедуру со следующими данными:
Question_Id View_Count Creation_Date tag_name
----------- ----------- ------------------------------ ----------
0 42 2009-09-10 00:00:00.000 sql
1 326 2008-08-04 00:00:00.000 sql
2 377 2008-08-04 00:00:00.000 sql
3 568 2008-08-03 00:00:00.000 sql
4 839 2008-08-01 00:00:00.000 sql
5 228 2009-03-01 00:00:00.000 sql
6 178 2009-03-11 00:00:00.000 sql
7 348 2009-08-11 00:00:00.000 c#
заполнить #tags 'sql'
GetTagViews '20090501', '20091001'
y m Views
----------- ----------- ---------------
2009 5 21.000000000000
2009 6 21.000000000000
2009 7 21.000000000000
2009 8 21.000000000000
2009 9 55.000000000000
заполнить #tags 'c #'
GetTagViews '20090501', '20091001'
y m Views
----------- ----------- ----------------------------------------
2009 5 .000000000000
2009 6 .000000000000
2009 7 .000000000000
2009 8 278.000000000000
2009 9 35.000000000000
заполнить #tags обоими 'sql' и 'c #'
GetTagViews '20090501', '20091001'
y m Views
----------- ----------- ----------------
2009 5 21.000000000000
2009 6 21.000000000000
2009 7 21.000000000000
2009 8 299.000000000000
2009 9 90.000000000000
(вы видите, что пик для (sql, c #) по сравнению только с (sql) для 2009-08, это из-за вопроса c #, задаваемого в этом месяце.)
N.B .: приблизительные оценки могут привести к разнице некоторых представлений (~ 1), если вы подытожите подробные представления и сравните их с исходными данными для данного вопроса!