一般软件网站的月下载量周下载量怎么实现?

时间:2021-11-26 17:16:55
我觉得是3个字段,分辨表示 总下载 月下载 周下载 

当有人下载时这3个都+1 

然后每周1让所有不为0的周下载为0 

每月同理 

不知道是不是这样实现的?

参考http://topic.csdn.net/u/20090919/10/78159299-fa55-45b6-9b53-19a911e062a5.html?seed=1317253056&r=59914114#r_59914114

SQL这边人气高点.

12 个解决方案

#1


触发器 

#2


用不着,只需要个时间字段即可.

然后使用DATEPART来统计即可.

DATEPART
返回代表指定日期的指定日期部分的整数。

语法
DATEPART ( datepart , date ) 

参数
datepart

是指定应返回的日期部分的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。

日期部分 缩写 
year yy, yyyy 
quarter qq, q 
month mm, m 
dayofyear dy, y 
day dd, d 
week wk, ww 
weekday dw 
Hour hh 
minute mi, n 
second ss, s 
millisecond ms 


week (wk, ww) 日期部分反映对 SET DATEFIRST 作的更改。任何一年的 1 月 1 日定义了 week 日期部分的开始数字,例如:DATEPART(wk, 'Jan 1, xxxx') = 1,此处 xxxx 代表任一年。

weekday (dw) 日期部分返回对应于星期中的某天的数,例如:Sunday = 1、Saturday = 7。weekday 日期部分产生的数取决于 SET DATEFIRST 设定的值,此命令设定星期中的第一天。

date

是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。对 1753 年 1 月 1 日之后的日期用datetime 数据类型。更早的日期存储为字符数据。当输入 datetime 值时,始终将其放入引号中。因为 smalldatetime 只精确到分钟,所以当用 smalldatetime 值时,秒和毫秒总是 0。

如果只指定年份的最后两位数字,则小于或等于"两位数年份截止期"配置选项的值的最后两位数字的数字所在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如,如果 two digit year cutoff 为 2049 (默认),则 49 被解释为 2049,2050 被解释为 1950。为避免模糊,请使用四位数的年份。

有关时间值指定的更多信息,请参见时间格式。有关日期指定的更多信息,请参见 datetime 和 smalldatetime。 

返回类型
int

注释
DAY、MONTH、和 YEAR 函数分别是 DATEPART(dd, date)、DATEPART(mm, date)、和 DATEPART(yy, date) 的同义词。

示例
GETDATE 函数返回当前日期;然而,比较时并不总是需要完整的日期信息(通常只是对日期的一部分进行比较)。此示例显示 GETDATE 及 DATEPART 的输出。

SELECT GETDATE() AS 'Current Date'
GO

下面是结果集:

Current Date                
--------------------------- 
Feb 18 1998 11:46PM         

SELECT DATEPART(month, GETDATE()) AS 'Month Number'
GO

下面是结果集:

Month Number 
------------ 
2            

此示例假设日期是 5 月 29 日。

SELECT DATEPART(month, GETDATE())
GO

下面是结果集:

----------- 
5           

(1 row(s) affected)

在此示例中,以数字表示日期。注意:SQL Server 将 0 解释为 01/01/1900。

SELECT DATEPART(m, 0), DATEPART(d, 0), DATEPART(yy, 0)

下面是结果集:

----- ------ ------
1     1      1900



#3


我想问的是是不是这种实现方式?

#4


比如有很多软件,难道要记录每一次下载的时间?然后在分类统计?

感觉这样很麻烦啊

#5


引用 4 楼 tossshinhwa 的回复:
比如有很多软件,难道要记录每一次下载的时间?然后在分类统计?

 感觉这样很麻烦啊

不麻烦,是这样的

#6


引用 4 楼 tossshinhwa 的回复:
比如有很多软件,难道要记录每一次下载的时间?然后在分类统计?

感觉这样很麻烦啊

我认为是这样的.

#7


这样的日志,会很长啊,比如有1W个软件,平均每个软件下载1W次,这样就有1亿条记录了. 

如果用我说的方法,我认为应该能很快统计出来. 

用日志的方法,如果要统计 
月下载TOP10,总下载TOP10的话感觉会很慢,因为要 
select top 10 count(*) from tableA group by id order by count(*) 
还有月排行,周排行,就还要where以下. 

在1亿条数据里面就慢了 

用我说的那种,虽然每个月之后,以前的数据就丢失了,但是应该能很快的得到结果 

直接 
select 列名1,列名2,... from tableB order by downtimesByTotal 
select 列名1,列名2,... from tableB order by downtimesByWeek 
... 

这样就出来了.而且这个tableB也只有1W条数据 



不知道dawugui考虑要这个效率问题没?

而且还有可能我不仅仅统计下载量,还有点击量.


#8


顶一下,

#9


如果要严格区分每一天所属的周和月,并且精简行数的话,用多个表比较好

先是日表,一个软件一天一条数据,即

软件ID 日期 下载次数    是否填进周表  是否填进月表
1      2009-09-14 12345  否              否

这样一个软件一天只产生一条记录

然后定时按日期把上一周的记录group by 软件ID,填进周表,同时是否填进周表置为是

软件ID 开始日期 结束日期 下载次数
1      2009-09-14 2009-09-20 654321

再定时按日期把上个月的记录group by 软件ID,填进月表

因为周和月是交叉的,所以判断当日表的某一条记录已经属于上个月又属于上周,且已经填进周表和月表的时候,就可清除日报的数据

而后,当周表和月表的数据已经过时之后,还可将其填进总下载并清理掉

这样,通过数个表的级联清理,数据的条数可以控制在2N-3N左右

#10


9L是个方法,但是更新不够及时啊.

周排行,月排行都是上周的排行.我看一般那些软件站,只要你下了,本日,本周,本月,总下载,都会立即+1的

如果再把9L的做成及时更新的,就跟我最早说的方法一样了.

#11


mark

#12


本日从日表里查,本周和本月就不行吗?不就是指定日期范围group by嘛,一样的。

周表和月排是为了解决数据量的问题,日表里过时的明细7条变1条,30条变一条,最终汇总到总下载,1个ID只有一条,不是让你来实时查询的。

#1


触发器 

#2


用不着,只需要个时间字段即可.

然后使用DATEPART来统计即可.

DATEPART
返回代表指定日期的指定日期部分的整数。

语法
DATEPART ( datepart , date ) 

参数
datepart

是指定应返回的日期部分的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。

日期部分 缩写 
year yy, yyyy 
quarter qq, q 
month mm, m 
dayofyear dy, y 
day dd, d 
week wk, ww 
weekday dw 
Hour hh 
minute mi, n 
second ss, s 
millisecond ms 


week (wk, ww) 日期部分反映对 SET DATEFIRST 作的更改。任何一年的 1 月 1 日定义了 week 日期部分的开始数字,例如:DATEPART(wk, 'Jan 1, xxxx') = 1,此处 xxxx 代表任一年。

weekday (dw) 日期部分返回对应于星期中的某天的数,例如:Sunday = 1、Saturday = 7。weekday 日期部分产生的数取决于 SET DATEFIRST 设定的值,此命令设定星期中的第一天。

date

是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。对 1753 年 1 月 1 日之后的日期用datetime 数据类型。更早的日期存储为字符数据。当输入 datetime 值时,始终将其放入引号中。因为 smalldatetime 只精确到分钟,所以当用 smalldatetime 值时,秒和毫秒总是 0。

如果只指定年份的最后两位数字,则小于或等于"两位数年份截止期"配置选项的值的最后两位数字的数字所在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如,如果 two digit year cutoff 为 2049 (默认),则 49 被解释为 2049,2050 被解释为 1950。为避免模糊,请使用四位数的年份。

有关时间值指定的更多信息,请参见时间格式。有关日期指定的更多信息,请参见 datetime 和 smalldatetime。 

返回类型
int

注释
DAY、MONTH、和 YEAR 函数分别是 DATEPART(dd, date)、DATEPART(mm, date)、和 DATEPART(yy, date) 的同义词。

示例
GETDATE 函数返回当前日期;然而,比较时并不总是需要完整的日期信息(通常只是对日期的一部分进行比较)。此示例显示 GETDATE 及 DATEPART 的输出。

SELECT GETDATE() AS 'Current Date'
GO

下面是结果集:

Current Date                
--------------------------- 
Feb 18 1998 11:46PM         

SELECT DATEPART(month, GETDATE()) AS 'Month Number'
GO

下面是结果集:

Month Number 
------------ 
2            

此示例假设日期是 5 月 29 日。

SELECT DATEPART(month, GETDATE())
GO

下面是结果集:

----------- 
5           

(1 row(s) affected)

在此示例中,以数字表示日期。注意:SQL Server 将 0 解释为 01/01/1900。

SELECT DATEPART(m, 0), DATEPART(d, 0), DATEPART(yy, 0)

下面是结果集:

----- ------ ------
1     1      1900



#3


我想问的是是不是这种实现方式?

#4


比如有很多软件,难道要记录每一次下载的时间?然后在分类统计?

感觉这样很麻烦啊

#5


引用 4 楼 tossshinhwa 的回复:
比如有很多软件,难道要记录每一次下载的时间?然后在分类统计?

 感觉这样很麻烦啊

不麻烦,是这样的

#6


引用 4 楼 tossshinhwa 的回复:
比如有很多软件,难道要记录每一次下载的时间?然后在分类统计?

感觉这样很麻烦啊

我认为是这样的.

#7


这样的日志,会很长啊,比如有1W个软件,平均每个软件下载1W次,这样就有1亿条记录了. 

如果用我说的方法,我认为应该能很快统计出来. 

用日志的方法,如果要统计 
月下载TOP10,总下载TOP10的话感觉会很慢,因为要 
select top 10 count(*) from tableA group by id order by count(*) 
还有月排行,周排行,就还要where以下. 

在1亿条数据里面就慢了 

用我说的那种,虽然每个月之后,以前的数据就丢失了,但是应该能很快的得到结果 

直接 
select 列名1,列名2,... from tableB order by downtimesByTotal 
select 列名1,列名2,... from tableB order by downtimesByWeek 
... 

这样就出来了.而且这个tableB也只有1W条数据 



不知道dawugui考虑要这个效率问题没?

而且还有可能我不仅仅统计下载量,还有点击量.


#8


顶一下,

#9


如果要严格区分每一天所属的周和月,并且精简行数的话,用多个表比较好

先是日表,一个软件一天一条数据,即

软件ID 日期 下载次数    是否填进周表  是否填进月表
1      2009-09-14 12345  否              否

这样一个软件一天只产生一条记录

然后定时按日期把上一周的记录group by 软件ID,填进周表,同时是否填进周表置为是

软件ID 开始日期 结束日期 下载次数
1      2009-09-14 2009-09-20 654321

再定时按日期把上个月的记录group by 软件ID,填进月表

因为周和月是交叉的,所以判断当日表的某一条记录已经属于上个月又属于上周,且已经填进周表和月表的时候,就可清除日报的数据

而后,当周表和月表的数据已经过时之后,还可将其填进总下载并清理掉

这样,通过数个表的级联清理,数据的条数可以控制在2N-3N左右

#10


9L是个方法,但是更新不够及时啊.

周排行,月排行都是上周的排行.我看一般那些软件站,只要你下了,本日,本周,本月,总下载,都会立即+1的

如果再把9L的做成及时更新的,就跟我最早说的方法一样了.

#11


mark

#12


本日从日表里查,本周和本月就不行吗?不就是指定日期范围group by嘛,一样的。

周表和月排是为了解决数据量的问题,日表里过时的明细7条变1条,30条变一条,最终汇总到总下载,1个ID只有一条,不是让你来实时查询的。