惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
博客园 - 叶小钗
S
SegmentFault 最新的问题
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
博客园_首页
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
腾讯CDC
D
Darknet – Hacking Tools, Hacker News & Cyber Security
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
L
Lohrmann on Cybersecurity
量子位
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tor Project blog
J
Java Code Geeks
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
博客园 - 三生石上(FineUI控件)
Attack and Defense Labs
Attack and Defense Labs
AI
AI
The Cloudflare Blog
T
Tailwind CSS Blog
S
Schneier on Security
爱范儿
爱范儿
PCI Perspectives
PCI Perspectives
Stack Overflow Blog
Stack Overflow Blog
S
Secure Thoughts
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
The Exploit Database - CXSecurity.com
博客园 - 【当耐特】
V2EX - 技术
V2EX - 技术
S
Securelist
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
Help Net Security
Help Net Security
C
Cisco Blogs
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
B
Blog RSS Feed
K
Kaspersky official blog
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
S
Security Affairs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Simon Willison's Weblog
Simon Willison's Weblog

博客园 - peace

MYSQL分页存储过程及事务处理 审批流设计方案的探究 WEB项目(B/S系统)打包安装(总结篇) 文件上传之断点续传方案 再次分享一个多选文件上传方案 SQL SERVER里的赋值机制闲聊 FLEX4.0开发流媒体视频播放器(总结篇) 告别ADO.NET实现应用系统无缝切换的烦恼(总结篇) SQL SERVER行转列应用小结 SQL SERVER函数——表值函数的处理 纠正网上流传的SQL取某一时间的当月第一天和最后一天的时间写法 告别.NET生成报表统计图的烦恼 发现联想手机P630型号的一个严重的系统Bug thinkpad T400型号安装server2003系统驱动共享 分享一个.NET版的多选文件上传操作示例 一个简单的httpModule应用 JS给页面标签添加事件(或超链接链接) 让默认焦点的按钮无虚框(又来无聊了) 利用ASP.NET日期控件制作“会议日程安排”(贴首页过把瘾)
SQL SERVER游标操作
peace · 2009-08-10 · via 博客园 - peace

      前几天一朋友做数据分析,数据源是EXCEL的,他们作分析都编写VBA脚本来分析,其中有一个问题问了我下,我看了之后感觉处理数据分析完全可以导入到数据库做分析,编写VBA来分析感觉怪怪(不过也有好处,可以直接把生成的数据转化成图形)。其中一个要求是这样的,某一车站从早上第一班车到晚上最后一班车,期间不断有人刷卡上车,要分析出每5分钟内有多少人上车。我拿过EXCEL表,只有一列数据有效,我把它导入到SQL SERVER里,如下图:

数据格式是存的是有点类似时间戳类型的,先要转换成标准的时间格式,简单处理下可以了,增加一列好了
UPDATE 西直门站 SET PullInTime=SUBSTRING(进站时间,1,4)+'-'+SUBSTRING(进站时间,5,2)+'-'+SUBSTRING(进站时间,7,2)+' '+SUBSTRING(进站时间,9,2)+':'+SUBSTRING(进站时间,11,2)  要求精确到分就可以了,秒就不转换了,转换后的格式如下:

该站的首发班车时间是凌晨5点,末班是晚上零点,首先可以构造一个时间的区间段表,如下
--构造区间段
declare @dayBegin datetime,@dayEnd datetime
declare @table table(StartTime datetime,EndTime datetime)
set @dayBegin = '2009-6-23 5:00'
set @dayEnd = '2009-6-24 0:00'
while @dayBegin <=@dayEnd
 begin
 insert @table select @dayBegin,dateadd(mi,5,@dayBegin)  --每5分钟一个间隔
 set @dayBegin=dateadd(mi,5,@dayBegin)
 end
--select * from @table  执行后数据如下

区间段分好了,就可以想到每取出一个时间段,然后在上车时间记录表里查询有多少条记录在该段时间内就行了,可以考虑用游标。
declare s cursor  --declare 创建游标
static
for select StartTime,EndTime from @table

--定义变量
declare @StartTime datetime,@EndTime datetime
declare @TempTable table(StartTime datetime,EndTime datetime,Number int)

open s  --打开游标
fetch next from s into @StartTime,@EndTime --提取上次提取行的下一行
while(@@fetch_status = 0)
begin
  insert @TempTable select isnull(max(@StartTime),@StartTime),isnull(max(@EndTime),@EndTime), count(*) from 西直门站 where PullInTime > @StartTime and PullInTime <=@EndTime 
--这里就不能用between and了,不然分隔的时间点上车的人数会在相邻的两个区间段重复计数,另外第一班车的上车时间等于@StartTime 没有计进去,这里不影响总体分析,当然可以做个标记,读一个区间段时用between...and...就可以了
   fetch next from s into @StartTime,@EndTime
end
close s  --关闭游标
deallocate s  --删除游标,释放资源
select * from @TempTable

最后执行的结果如下: