den Stack-Überlauf öffentliche Daten-Dump verwenden, habe ich drei einfache Tabellen erstellt:Approximierende Seitenansichten pro Tag (oder Tag-Gruppe) pro Monat mit begrenzten Daten?
- Fragen (Question_Id, VIEW_COUNT, creation_date)
- Schlagworte (Tag_Name)
- QuestionTags (Question_Id, Tag_Name)
Die Questions-Tabelle hat Hunderttausende von Zeilen mit Creation_Date von einem Jahr bis heute. Mit Blick auf den Daten gibt es zwei bemerkenswerte Trends:
- Anzahl der Fragen Periodisches erhöhen - zum Beispiel, gibt es mehr Fragen in diesem Monat wurden gebeten, als vor drei Monaten
- Fragen Ansichten haben eine Long Tail - Durch das Betrachten von Ansichten basierend auf offenen Wochen können wir sehen, dass die meisten Fragen einer Frage in der ersten Woche auftreten; eine geringere Menge in der zweiten und dritten; und ein langer, konstanter Schwanz in den folgenden Wochen
Wenn keiner dieser Faktoren kam zu spielen, wäre es ziemlich trivial Verkehr für einen bestimmten Tag zu schätzen (oder eine Gruppe von Tags) über einen Monat:
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
Aber wegen der oben genannten Faktoren (vor allem der lange Schwanz), bin ich mir nicht sicher, wie man Ansichten annähert. Meine Gedanken sind, eine Funktion zu erstellen, die mithilfe der Long-Tail-Formel Ansichten für einen Monat basierend auf der aktuellen Anzahl von Ansichten und offenen Wochen berechnet.
Hier ist, was ich kam mit dem Schwanz zu finden:
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
Wie soll ich diese SQL-Abfrage zu erstellen, gehen Sie?
Das Endziel ist ein Stored Procedure, das eine CSV-Zeichenfolge aus Tags eingibt und die Seitenaufrufe der letzten sechs Monate für diese Tags ausspuckt.
UPDATE Nachdem ich das Tumbleweed-Abzeichen "verdient" hatte, dachte ich, es wäre Zeit für ein Kopfgeld!
Das sieht sehr genau aus, wonach ich gesucht habe; Was die dynamische Natur anbelangt ... alles wird gemittelt, besonders wenn wir die "Freak" -Fragen wie http: // stackoverflow fallen lassen.com/questions/84556/whats-your-liebling-programmierer-cartoon –
Möglicherweise müssen Sie die Formel, insbesondere die V und Abklingrate λ Feinabstimmung. Decay Rate für solche Fragen ist sehr niedrig (1/25?). –