请问一下:上面的图是一个学习记录表.
每天的学习时长(分钟)为:EndTime-StartTime,请问怎么取最近前两次(一天内N次学习也计为一次)的学习时长.比如上面表的数据最近的两天时长是(为当天基准):2014-11-12及2014-11-10这两天的时间学习之记录..请问这个SQL语句怎么写.谢谢...!!!

解决方案 »

  1.   

    SELECT * FROM(
    SELECT ROW_NUMBER()OVER(ORDER BY CONVERT(VARCHAR(10),StartTime,120) DESC)RN
    ,UserID,CONVERT(VARCHAR(10),StartTime,120)日期
    ,SUM(DATEDIFF(MINUTE,StartTime,EndTime))学习时长
    FROM 学习记录表
    WHERE EndTime<CONVERT(VARCHAR(10),GETDATE(),120)
    GROUP BY UserID,CONVERT(VARCHAR(10),StartTime,120)
    )T WHERE RN<=2
      

  2.   

    如果一次性取出多个  UserID 的数据,使用 1# 的写法。
    如果一次仅取出一个 UserID 的数据库,使用 top 2 和 order by StartTime desc 就可以了。
      

  3.   

    比如userId有:2,4,9三个,分别在14,10,5号这三天都有N条记录,如果三个ID在14日都有多次记录,就去重count结果为:3,,如果只有ID号为4,,9在10号有多条记录,则Count为2.谢谢..
      

  4.   


    每天登录多次,只计数一次,是这个意思吧?
    -- 使用一下 distinct 
    select userid, COUNT (distinct CONVERT(varchar(10),logdate,121))
    from m
    where logdate < GETDATE() - 3 
    group by userid
    go
      

  5.   

    不明白去重什么意思,是登录时间和退出时间都一样吗SELECT * FROM(
    SELECT ROW_NUMBER()OVER(PARTITION BY UserID ORDER BY CONVERT(VARCHAR(10),StartTime,120) DESC)RN
    ,UserID,CONVERT(VARCHAR(10),StartTime,120)日期
    ,SUM(DATEDIFF(MINUTE,StartTime,EndTime))学习时长
    FROM (SELECT UserID,StartTime,EndTime FROM 学习记录表 GROUP BY UserID,StartTime,EndTime)T1
    WHERE EndTime<CONVERT(VARCHAR(10),GETDATE(),120)
    GROUP BY UserID,CONVERT(VARCHAR(10),StartTime,120)
    )T WHERE RN<=3
      

  6.   

    是这样的:
    13~18为都为本年第47周,每个ID只计数一次,所以结果为:2
    8~12为本年第46周,每个ID只计数一次,所以结果为:2
    7日为本年第45周,每个ID只计数一次,所以结果也为:2
    按周计数,每个ID只计数一次。
    就是这个意思..谢谢!!!
      

  7.   

    你的历法也太奇怪了,和人类的历法差太多,我们人类一周有7天哦,而从你的第46周来看,你的一周只有5天~
    开个玩笑,我相信这只是你的举例代指元归正传,周日是要当成一周的结束还是开始呢
    以下假设周日是一周开始SELECT DATEPART(WEEK,StartTime)[第几周],COUNT(DISTINCT Userid)[计数]
    FROM 学习记录表
    GROUP BY DATEPART(WEEK,StartTime)