当前位置: 代码迷 >> Sql Server >> 存储过程点击排行榜有关问题
  详细解决方案

存储过程点击排行榜有关问题

热度:17   发布时间:2016-04-24 09:59:13.0
存储过程点击排行榜问题

ALTER proc [dbo].[Ranklist](
@Mid int =385,  --条件语句(不用加where) 
@TotalCount int =3 --绑定前条记录 
)
AS  
BEGIN  
      declare @Count int;
      set @Count=0;
      select @Count=count(*) from (select top @TotalCount * from Product where CreateTime between dateadd(dd,-7,getdate()) and getdate() and [Audit]>0 and Mid=@Mid order by Click desc) a 
      if(@Count<@TotalCount)
      begin
          --绑定数量增加1天
          --递归调用该存储过程
      end
      else
          --返回结果集
END


因为数据不是每天都更新,我这样做的目的就是防止7天内没有更新数据的话,不至于前台没有数据显示,
我的思路是这样的,但是不会写这个过程,求各位大神帮帮完成这个过程!
------解决思路----------------------
你要group by一下再取top就不会只拿到全部数据的top值了
------解决思路----------------------
引用:
Quote: 引用:


select top 10 * from Product
where CreateTime between dateadd(dd,-7,getdate()) and getdate() and [Mid]=118
order by Click desc

就是这样的,就好比是一周点击排行榜这样的,
我担心的是假如说这7天内没有上架新产品的话,这条查询时没有数据的。

感觉可以这样。先把最近7天内的日期改成一样的。(不用真改表数据。用个CASE 判断下)然后
top  7    ..... order by  日期 desc,click desc
不要日期限定。 这样如果最近7天内不止7条数据。就不会取到之前的。如果没有就是按照日期继续取前面的。
这样比例的循环效率要好

with cte as 
(select  case when DATEADD(dd,-7,getdate())<createtime 
 then GETDATE() else createtime end as createtime,
 MID,CLIck from Product)
 select top  7 * from cte
 order by createtime,click

写错了不好意思


with cte as 
(select  case when DATEADD(dd,-7,getdate())<createtime 
 then GETDATE() else createtime end as createtime,
 MID,CLIck from Product)
 select top  7 * from cte
 order by createtime desc ,click desc


------解决思路----------------------
引用:
我想查询的结果是,如果一周内没有查询出数据的话就在往前一天查询,以此类推。知道查询出10条最近点击量大的数据来

其实黄版的想法和我早上的想法相接近,按日期做分组排序partition by,已点击量倒叙,就得出每日点击量最多,外部直接按日期排序取前10,这样永不落空。但这里有唯一一种情况是不符合楼主思路,就是假设时间段内只有9条记录,9条中有一条点击只有1次,而往前推1天,总共能有11条记录,也就是多出的那天有2条记录,但两条点击数都比1大,这时楼主的思路会是8+2,而我说的分组排序会是9+1,区别在这里
  相关解决方案