1. 程式人生 > >統計下載的周排行跟月排行

統計下載的周排行跟月排行

   一般的下載站應該都有這個需求,統計本週下載排行,本月下載排行,另外如一些流量統計站也會有本週IP,本月IP這些統計需求, 需要注意的是本週下載,本月下載,跟最近7天下載,最近一個月(30)下載是有區別的, 最近7天下載,是給你一個時刻,那麼從這個時刻7天前到這個時刻的下載統計,這個時間長度多是7天,而本週下載時間長度,跟給你的時刻有關,如果給你的時刻對應的是星期天早8:00,那麼這個時刻就是星期天凌晨0:00 到8:00共8個小時的下載統計,如果是星期六的23:59,那麼就是這個星期7天來的統計.

  上面說到需要統計 日排行,周徘,跟月徘, 因此最下的排行統計時間粒度應該為一天, 如果還要按時段統計,那麼最小統計粒度應該為小時,

  為完成以上要求有如下表的設計

 日下載數表(軟體ID(int),下載數(int),日期(datetime)) 

 每個下載動作多會進行如下操作

Create Proc 日表_Add
@軟體ID int
AS

Declare @ExistID int
Set @ExistsID=0
Select @ExistsID=軟體ID From [日表] Where @軟體ID=軟體iD And datediff(dd,日期,getdate())=0
If @ExistsID !=0
  Begin
  Update ....
  End
Else
  Begin
  Insert.....
  End
////

在上面的資料結構基礎上,有如下的周排行統計,跟月排行統計

Create Proc 日表_StatByWeek

@datePoint datetime ---給定的時刻

As

 Select 軟體ID, Sum(下載次數) As Amount  From  [日表] Where datediff(wk,日期,@datePoint)=0 Group By 軟體ID Order By Amount DESC

-按月統計

Create Proc 日表_StatByWeek

@datePoint datetime ---給定的時刻

As

 Select 軟體ID, Sum(下載次數) As Amount  From  [日表] Where datediff(mm,日期,@datePoint)=0 Group By 軟體ID Order By Amount DESC

 注意上面傳入的引數 @datePoint 如果我當前時刻,那麼就是本週(月)初到當前時刻的時間長度,如果是以前的周(月)中的某一時刻,那麼統計出來的將是傳入時刻對應周或月的完整一週或一月的統計

 --統計連續7天的下載

 Create Proc 日表_StatBySerialDays

 @datePoint datetime,

 @dayNum int --連續天數

As

 Select 軟體ID,Sum(下載數) Amount From [日表] Where datediff(dd,日期,@datePoint)<= @dayNum Group By 軟體ID  Order By Amount DESC

--------------

另外如果對效能有要求,那麼應該建立周表,跟月表

周表(軟體ID,下載數目,更新時間(datetime))

月表(軟體ID,下載數目,更新時間(datetime))

每個下載 動作,除了更新日表外,還更新周表跟月表

更新的演算法類似上面的 日表_Add

只是datediff 中分別換成 wk跟mm ,以找出同周,或同月的資料

統計時同樣使用datediff找出給你時刻同周,或同月的下載記錄集(這裡不需要分組了)