IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO
create table tb(日期 varchar(23))
insert into tb values('2011-01-18 08:56:43.000')
insert into tb values('2011-01-18 08:58:43.000')
insert into tb values('2011-01-18 09:07:43.000')
insert into tb values('2011-01-18 09:09:43.000')
insert into tb values('2011-01-18 09:10:43.000')
insert into tb values('2011-01-18 09:13:43.000')
insert into tb values('2011-01-18 09:17:43.000')
insert into tb values('2011-01-18 09:46:43.000')
insert into tb values('2011-01-18 09:48:43.000')
insert into tb values('2011-01-18 09:47:43.000')
insert into tb values('2011-01-18 09:55:43.000')
goselect * from [tb]
需求:这个是一个访问统计。
要求将15分钟内的所有访问,全部只算作一次访问。
也就是8点45分-9点整的所有记录,只算一次。9点-9点15,算一次。9点15到9点30算一次。以此类推
可能15分分钟内都没有访问记录。
有非常多的数据,每天每小时每分每秒都可能有记录。
求最后,总访问次数。以上测试数据,结果返回5。求指导,感激不尽。

解决方案 »

  1.   

    select count(distinct(datediff(mi,0,日期)/15-datediff(mi,0,'2011-01-18 08:45:00.000')/15+1)) from [tb]
      

  2.   

    IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
    GO
    create table tb(日期 varchar(23))
    insert into tb values('2011-01-18 08:56:43.000')
    insert into tb values('2011-01-18 08:58:43.000')
    insert into tb values('2011-01-18 09:07:43.000')
    insert into tb values('2011-01-18 09:09:43.000')
    insert into tb values('2011-01-18 09:10:43.000')
    insert into tb values('2011-01-18 09:13:43.000')
    insert into tb values('2011-01-18 09:17:43.000')
    insert into tb values('2011-01-18 09:46:43.000')
    insert into tb values('2011-01-18 09:48:43.000')
    insert into tb values('2011-01-18 09:47:43.000')
    insert into tb values('2011-01-18 09:55:43.000')
    go;with cte as
    (select ROW_NUMBER()over(partition by left(日期,13),
          (datepart(mi,日期)-1)/15 order by 日期) no,* from [tb])
    select COUNT(*) from cte where no=1/*
    -----------
    4
      

  3.   

    CSDN,总能解决我的问题。哎。
    2位都能解决,4楼的扩展行强大一些,但是目前的SQL语句,更适合用2楼的来改。。
    谢谢各位了。结贴。