现在的位置: 首页 > 综合 > 正文

每隔5分钟统计一次记录的应用实例

2013年01月17日 ⁄ 综合 ⁄ 共 4491字 ⁄ 字号 评论关闭

一张电话报表(id,time,telephone) time:表示顾客打入时记录的时间

实例如下:
1 2006-06-11 05:52:12 1360065460758
2 2006-06-11 06:09:05 1380138017292
3 2006-06-11 06:25:13 97363849310
4 2006-06-11 06:26:08 61763849310
5 2006-06-11 06:34:59 60054190811
6 2006-06-11 06:44:04 1397305138553
7 2006-06-11 06:51:30 60063849310  
8 2006-06-11 06:53:14 92713061620671
9 2006-06-11 06:53:22 11713061620671
10 2006-06-11 06:58:34 32054196057
11 2006-06-11 07:04:42 92752581156

统计一下每隔5分钟打进电话多少个?
怎么写SQL语句啊
注意 我可能这样的数据有几万条

很明显,比如像鱼是按5分钟为步长生成了时间段,然后按时间段连接.保证了每个5分钟都被统计.

 

/*------------------------------------------------------------------
--  Author : htl258(Tony)
--  Date   : 2010-04-17 22:01:29
--  Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
    Jul  9 2008 14:43:34
    Copyright (c) 1988-2008 Microsoft Corporation
    Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)

------------------------------------------------------------------*/
--> 生成测试数据表:tb

IF OBJECT_ID('[tb]') IS NOT NULL
   
DROP TABLE [tb]
GO
CREATE TABLE [tb]([id] INT,[time] DATETIME,[telephone] NVARCHAR(20))
INSERT [tb]
SELECT 1,N'2006-06-11 05:52:12',1360065460758 UNION ALL
--新增记录
SELECT 12,N'2006-06-11 05:53:12',136006546058 UNION ALL
SELECT 13,N'2006-06-11 05:54:12',136006546758 UNION ALL
SELECT 14,N'2006-06-11 05:55:12',136006540758 UNION ALL
SELECT 15,N'2006-06-11 05:54:12',136006560758 UNION ALL
-------
SELECT 16,N'2006-06-11 05:57:11',1360065460758 UNION ALL--精确到分归入后面的记录,精确到秒归到前面的记录
--
-----
SELECT 2,N'2006-06-11 06:09:05',1380138017292 UNION ALL
SELECT 3,N'2006-06-11 06:25:13',97363849310 UNION ALL
SELECT 4,N'2006-06-11 06:26:08',61763849310 UNION ALL
SELECT 5,N'2006-06-11 06:34:59',60054190811 UNION ALL
SELECT 6,N'2006-06-11 06:44:04',1397305138553 UNION ALL
SELECT 7,N'2006-06-11 06:51:30',60063849310 UNION ALL
SELECT 8,N'2006-06-11 06:53:14',92713061620671 UNION ALL
SELECT 9,N'2006-06-11 06:53:22',11713061620671 UNION ALL
SELECT 10,N'2006-06-11 06:58:34',32054196057 UNION ALL
SELECT 11,N'2006-06-11 07:04:42',92752581156
GO
--SELECT * FROM [tb]

-->SQL查询如下:
--
此查询精确到分:
SELECT ''+LTRIM(N+1)+'个5分钟' AS [5分钟系列],
   
COUNT(1) AS 记录数
FROM (
   
SELECT
        N
=DATEDIFF(N,(SELECT MIN(TIME) FROM TB),TIME)/5
   
FROM TB
    )
AS T
GROUP BY N
/*
5分钟系列                 记录数
--------------------- -----------
第1个5分钟                5
第2个5分钟                1
第4个5分钟                1
第7个5分钟                2
第9个5分钟                1
第11个5分钟               1
第12个5分钟               1
第13个5分钟               2
第14个5分钟               1
第15个5分钟               1

(10 行受影响)
*/
--此查询精确到秒:
SELECT ''+LTRIM(N+1)+'个5分钟' AS [5分钟系列],
   
COUNT(1) AS 记录数
FROM (
   
SELECT
        N
=DATEDIFF(SS,(SELECT MIN(TIME) FROM TB),TIME)/300
   
FROM TB
    )
AS T
GROUP BY N

 

/*
5分钟系列                 记录数
--------------------- -----------
第1个5分钟                6
第4个5分钟                1
第7个5分钟                2
第9个5分钟                1
第11个5分钟               1
第12个5分钟               1
第13个5分钟               2
第14个5分钟               1
第15个5分钟               1

(9 行受影响)
*/

 

-----------

附:一个按五分钟分段统计的例

create table tb(时间 datetime , 金额 int)
insert into tb values('2007-1-1 10:00:23' ,          8 )
insert into tb values('2007-1-1 10:01:24' ,          4 )
insert into tb values('2007-1-1 10:05:00' ,          2
insert into tb values('2007-1-1 10:06:12' ,          3 )
insert into tb values('2007-1-1 10:08:00' ,          1 )
insert into tb values('2007-1-1 10:12:11' ,          5 )
go

--时间段>=10:00:00 and 时间段<10:05:00
select dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,-1,时间),120),dateadd(ss,-1,时间))/5)*5,

       convert(varchar(10),时间,120)) as 时间段,
      
count(*) as 行数,
      
sum(金额) as 总金额
from tb
group by dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,-1,时间),120),dateadd(ss,-1,时间))/5)*5,

    convert(varchar(10),时间,120))
/*
时间段                                                    行数          总金额        
------------------------------------------------------ ----------- -----------
2007-01-01 10:00:00.000                                3           14
2007-01-01 10:05:00.000                                2           4
2007-01-01 10:10:00.000                                1           5
(所影响的行数为 3 行)
*/

--时间段>10:00:00 and 时间段<=10:05:00
select dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,1,时间),120),dateadd(ss,1,时间))/5)*5,

       convert(varchar(10),时间,120)) as 时间段,
      
count(*) as 行数,
      
sum(金额) as 总金额
from tb
group by dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,1,时间),120),dateadd(ss,1,时间))/5)*5,

        convert(varchar(10),时间,120))
/*
时间段                                                    行数          总金额        
------------------------------------------------------ ----------- -----------
2007-01-01 10:00:00.000                                2           12
2007-01-01 10:05:00.000                                3           6
2007-01-01 10:10:00.000                                1           5

(所影响的行数为 3 行)
*/

drop table tb

 

 

抱歉!评论已关闭.