关于统计周排行与月排行的SQL语句, 求SQL高人帮忙优化.

wapit 2010-03-01 12:55:11
表结构:
InfoTable: ID,Name...
DownCount: ID,InfoID,CountDate,DownTimes

select ID,Name,
ISNULL((select SUM(DownTimes) from DownCount
where InfoID=InfoTable.ID and DATEDIFF(d,CountDate,GetDate())<=7),0)
as WeekDowns,
ISNULL((select SUM(DownTimes) from DownCount
where InfoID=InfoTable.ID and DATEDIFF(d,CountDate,GetDate())<=30),0)
as MonthDowns
from InfoTable
order by MonthDowns desc

结果:
ID, Name,WeekDowns,MonthDowns

这样取当然没有问题. 但我觉得这方法有些笨, 效率估计不高, 求SQL高人帮忙优化.

当然了, 在项目中这种数据我肯定会缓存起来不会次次去数据库取的.
...全文
259 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
林小白 2011-09-21
  • 打赏
  • 举报
回复
select [id],count(*) from tb
where hittime between dateadd(dd,-7,gedate()) and getdate()
group by [id]
select *
from tb

就这方法就行,如果数据不好拼接,你用一个临时表拼一下,再取。
whb147 2010-03-01
  • 打赏
  • 举报
回复


select a.ID,a.Name,isnull(b.WeekDowns,0) as WeekDowns,isnull(c.MonthDowns,0) as MonthDowns
from
InfoTable a
left join (select InfoID,sum(DownTimes ) as WeekDowns from DownCount b where DATEDIFF(d,CountDate,GetDate())<=7 group by InfoID) b on a.id=b.InfoID
left join (select InfoID,sum(DownTimes ) as MonthDowns from DownCount b where DATEDIFF(d,CountDate,GetDate())<=30 group by InfoID) c on a.id=c.InfoID

order by MonthDowns desc

这个写法不知道跟你的比那个快,你测试一下看看
MarcuseXiao 2010-03-01
  • 打赏
  • 举报
回复
如果是访问统计数据比较频繁,建议修改一下设计,生成相应的统计表。这样肯定快。不管你用什么语句,总是要扫描多条数据记录,肯定不会快的。
whb147 2010-03-01
  • 打赏
  • 举报
回复
还有一个问题
就是是自然周第一周,第二周……,自然月1月,2月,3月……?
还是就是当前天往前7,为一周,往前30天为一月?
whb147 2010-03-01
  • 打赏
  • 举报
回复
我晕,一次查出来那就要left join le
wapit 2010-03-01
  • 打赏
  • 举报
回复
引用 1 楼 wuyq11 的回复:
select [id],count(*) from tb
where hittime between dateadd(dd,-7,gedate()) and getdate()
group by [id]
select *
from tb
--order by DATEPART(month,时间字段)--按月
--order by DATEPART(week,时间字段)--按周


我想一次查出来......
随风落梦 2010-03-01
  • 打赏
  • 举报
回复
引用 1 楼 wuyq11 的回复:
select [id],count(*) from tb
where hittime between dateadd(dd,-7,gedate()) and getdate()
group by [id]
select *
from tb
--order by DATEPART(month,时间字段)--按月
--order by DATEPART(week,时间字段)--按周

up
gongsun 2010-03-01
  • 打赏
  • 举报
回复
...

回复内容太短了!
liuyjcel 2010-03-01
  • 打赏
  • 举报
回复
引用 1 楼 wuyq11 的回复:
select [id],count(*) from tb
where hittime between dateadd(dd,-7,gedate()) and getdate()
group by [id]
select *
from tb
--order by DATEPART(month,时间字段)--按月
--order by DATEPART(week,时间字段)--按周


可以借鉴
灵雨飘零 2010-03-01
  • 打赏
  • 举报
回复
引用 1 楼 wuyq11 的回复:
select [id],count(*) from tb
where hittime between dateadd(dd,-7,gedate()) and getdate()
group by [id]
select *
from tb
--order by DATEPART(month,时间字段)--按月
--order by DATEPART(week,时间字段)--按周


up
wuyq11 2010-03-01
  • 打赏
  • 举报
回复
select [id],count(*) from tb
where hittime between dateadd(dd,-7,gedate()) and getdate()
group by [id]
select *
from tb
--order by DATEPART(month,时间字段)--按月
--order by DATEPART(week,时间字段)--按周
happy664618843 2010-03-01
  • 打赏
  • 举报
回复
引用 1 楼 wuyq11 的回复:
select [id],count(*) from tb
where hittime between dateadd(dd,-7,gedate()) and getdate()
group by [id]
select *
from tb
--order by DATEPART(month,时间字段)--按月
--order by DATEPART(week,时间字段)--按周

。。。
seeQe 2010-03-01
  • 打赏
  • 举报
回复
看看 sql server 的帮助语法,其中有相关函数的,
另外可以使用视图或表来时保存历史处理数据,速度当然好些

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧