Utilisation de la décharge de données publiques débordement de pile, j'ai créé trois tables simples:Approximation des vues de page par balise (ou groupe de balises) par mois avec des données limitées?
- Questions (question_id, view_count, creation_date)
- Tags (TAG_NAME)
- QuestionTags (question_id, TAG_NAME)
La table Questions contient des centaines de milliers de lignes avec Creation_Date depuis l'année dernière jusqu'à aujourd'hui. Donnant sur les données, il y a deux tendances notables:
- Nombre de questions Augmentation par période - par exemple, il y avait plus de questions posées ce mois-ci il y a trois mois
- Questions Vues ont une longue queue - en regardant les vues basées sur les semaines ouvertes, nous pouvons voir que la plupart des vues d'une question se produisent dans la première semaine; un montant moindre dans la deuxième et la troisième; et une longue queue constante dans les semaines suivantes
Si aucun de ces facteurs sont venus pour jouer, ce serait assez trivial d'estimer le trafic pour un tag donné (ou groupe d'étiquettes) plus d'un mois:
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
Mais en raison des facteurs mentionnés ci-dessus (en particulier la longue queue), je ne suis pas sûr comment approcher les vues. Mes pensées sont de créer une fonction qui, en utilisant la formule longue queue, calcule les vues pour un mois en fonction du nombre actuel de vues et de semaines ouvertes.
Voici ce que je suis venu avec pour trouver la queue:
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
Comment dois-je procéder pour créer cette requête SQL?
L'objectif final est une procédure stockée qui introduit une chaîne CSV de balises et crache les pages vues des six derniers mois pour ces balises. Après avoir gagné le badge tumbleweed, j'ai pensé qu'il était temps pour une prime!
Cela ressemble très près à ce que je cherchais; quant à la nature dynamique ... tout est moyen, surtout quand on laisse tomber les questions "bizarres" comme http: // stackoverflow.com/questions/84556/whats-your-favorite-programmer-cartoon –
Vous devrez peut-être affiner la formule, en particulier le V et le taux de décroissance λ. Le taux de décroissance pour de telles questions est très faible (1/25?). –