Utilizando el volcado de datos pública de desbordamiento de pila, he creado tres tablas simples:Aprox. Páginas vistas por etiqueta (o grupo de etiquetas) por mes con datos limitados?
- Preguntas (question_id, view_count, creation_date)
- Etiquetas (TAG_NAME)
- QuestionTags (question_id, TAG_NAME)
La tabla de Preguntas tiene cientos de miles de filas con Creation_Date desde hace un año hasta hoy. Mirando por encima de los datos, hay dos tendencias notables:
- número de preguntas incrementará en un período de - por ejemplo, hubo más Preguntas este mes que hace tres meses
- Preguntas Vistas tienen una larga cola: al observar las vistas en función de las semanas abiertas, podemos ver que la mayoría de las vistas de una pregunta ocurren en la primera semana; una cantidad menor en el segundo y el tercero; y una cola larga, constante en las siguientes semanas
Si ninguno de estos factores se introdujo para jugar, sería bastante trivial para estimar el tráfico de una determinada etiqueta (o grupo de etiquetas) más de un mes:
SELECT YEAR(Q.Creation_Date)
,MONTH(Q.Creation_Date)
,SUM(Q.View_Count/DATEDIFF(m,Q.Creation_Date,GETDATE()))
FROM Questions Q
JOIN QuestionTags QT
ON Q.Question_Id = QT.Question_Id
WHERE QT.Tag_Name IN ('c#','.net', ...)
GROUP BY YEAR(Q.Creation_Date), MONTH(Q.Creation_Date)
ORDER BY 1,2
Pero debido a los factores antes mencionados (especialmente la cola larga), no estoy seguro de cómo aproximar las vistas. Mi idea es crear una función que, usando la fórmula de cola larga, calcule las vistas de un mes en función del número actual de vistas y semanas abiertas.
Esto es lo que se me ocurrió para encontrar la cola:
DECLARE @SDTE DATETIME, @EDTE DATETIME
SELECT @SDTE = '2009-01-11' -- after new years holiday
,@EDTE = CAST(MAX([Creation_Date]) AS INT)
FROM [Questions]
SELECT [DaysOpen_Count]
,AVG([WView_Count])
FROM
(
SELECT QT.[Tag_Name],
Q.[View_Count],
[DaysOpen_Count] = DATEDIFF(DAY, Q.[Creation_Date], @EDTE),
[WView_Count] = CAST(Q.[View_Count]/(DATEDIFF(DAY, Q.[Creation_Date], @EDTE)/7.0) AS INT)
FROM [Questions] Q
INNER JOIN [QuestionTags] QT
ON Q.[Question_Id] = QT.[Question_Id]
WHERE [Tag_Name] IN ('c#','.net',...)
AND [Creation_Date] < @EDTE
) Q
GROUP BY [DaysOpen_Count]
ORDER BY 1,2
¿Cómo debo proceder para crear esta consulta SQL?
El objetivo final es un proceso almacenado que ingresa una cadena CSV de etiquetas y escupe las vistas de las últimas seis páginas de esas etiquetas.
ACTUALIZACIÓN Después de "ganar" la insignia de tumbleweed, ¡pensé que era hora de una recompensa!
Esto se ve muy cerca de lo que estaba buscando; en cuanto a la naturaleza dinámica ... todo promedia, especialmente una vez que dejamos caer las preguntas "freak" como http: // stackoverflow.com/questions/84556/whats-your-favorite-programmer-cartoon –
Puede que tenga que afinar la fórmula, especialmente la V y la tasa de desintegración λ. La tasa de caries para tales preguntas es muy baja (1/25?). –