我有个表A ID Time1 Time2
---------------------------------------------------
1 2011/10/18 14:57:00 2011/10/18 14:58:00
2 2011/10/18 15:10:00 2011/10/18 15:28:00
3 2011/10/18 15:38:00 2011/10/18 15:48:00
4 2011/10/18 15:58:00 2011/10/18 16:08:00
...我想要求第二列的 Time1与第一列 Time2 的差,以此类推,然后求所有差的平均值,这样的需求能不能用sql语句实现。
---------------------------------------------------
1 2011/10/18 14:57:00 2011/10/18 14:58:00
2 2011/10/18 15:10:00 2011/10/18 15:28:00
3 2011/10/18 15:38:00 2011/10/18 15:48:00
4 2011/10/18 15:58:00 2011/10/18 16:08:00
...我想要求第二列的 Time1与第一列 Time2 的差,以此类推,然后求所有差的平均值,这样的需求能不能用sql语句实现。
解决方案 »
- 网站内网能访问,外网不能访问?好奇怪?
- ============关于Cookie的使用==========
- 帮我看下这段代码怎么了,老提示控件“TextBox1”必须放在具有 runat=server 的窗体标记内。
- |M| 救命啊...在线等: 在我的DataList中的ImageButton无法响应dl_list_ItemCommand
- CSDN的BBS是如何实现的?
- 急,新手求解答。关于页面延迟加载的问题
- 枚举的"文档注释标记"如何写?
- 一个简单的类,能不能解决?????????????????????
- 求助!求助!
- datagrid 的使用步骤是什么?
- 正则表达式解析内容
- 在XP下TFS连接不了服务器
自己写个存储过程实现吧
select datediff(mm,'2010-06-01','2012-05-01')
select datediff(dd,'2010-06-01','2012-05-01')
CREATE TABLE TEST (
ID int,
Time1 datetime,
Time2 datetime
);
INSERT INTO TEST VALUES(1, '18.10.2011 14:57:00', '18.10.2011 14:58:00');
INSERT INTO TEST VALUES(2, '18.10.2011 15:10:00', '18.10.2011 15:28:00');
INSERT INTO TEST VALUES(3, '18.10.2011 15:38:00', '18.10.2011 15:48:00');
INSERT INTO TEST VALUES(4, '18.10.2011 15:58:00', '18.10.2011 16:08:00');declare @result int = 0select @result = @result + DATEDIFF(SECOND, Time1, time2)
from TESTselect @result / (select COUNT(ID) from Test)
INSERT INTO @table(time1,time2)
SELECT '2011/10/18 14:57:00','2011/10/18 14:58:00' UNION ALL
SELECT '2011/10/18 15:10:00','2011/10/18 15:28:00' UNION ALL
SELECT '2011/10/18 15:38:00','2011/10/18 15:48:00' UNION ALL
SELECT '2011/10/18 15:58:00','2011/10/18 16:08:00'
;WITH CTE AS
(
SELECT *,ROW_NUMBER() OVER(ORDER BY id) AS Row FROM @table
),
RS AS
(
SELECT id,DATEDIFF(n,time1,time11) timespan1,DATEDIFF(n,time2,time22) timespan2
FROM(SELECT *,(SELECT time1 FROM CTE WHERE Row=T.Row+1) time11,(SELECT time2 FROM CTE WHERE Row=T.Row+1) time22 FROM CTE T WHERE Row%2=1) TT
)
SELECT * FROM rs
/*(4 行受影响)
id timespan1 timespan2
----------- ----------- -----------
1 13 30
3 20 20(2 行受影响)*/
---------------
;WITH CTE AS
(
SELECT *,ROW_NUMBER() OVER(ORDER BY id) AS Row FROM @table
),
RS AS
(
SELECT id,DATEDIFF(n,time1,time11) timespan1,DATEDIFF(n,time2,time22) timespan2
FROM(SELECT *,(SELECT time1 FROM CTE WHERE Row=T.Row+1) time11,(SELECT time2 FROM CTE WHERE Row=T.Row+1) time22 FROM CTE T WHERE Row%2=1) TT
)
SELECT AVG(timespan1) timeavg1,AVG(timespan2) timeavg1 FROM rs/*timeavg1 timeavg1
----------- -----------
16 25(1 行受影响)
*/
我的需求是第二行的time 1与上一行的time2 的差值,然后将所有差值求平均值
SELECT [id],
timea,
timeb,
Datediff(second, timea, timeb) AS TimeSpan
FROM TestA
UNION ALL
SELECT Max([id]),
Max(timea),
Max(timeb),
Avg(CONVERT(FLOAT, Datediff(second, timea, timeb))) AS TimeSpan
FROM TestA
left join (select ROW_NUMBER() OVER (ORDER BY id) AS ROWNUMBER, Time1, Time2 from TestTime) t2 on t2.ROWNUMBER = t1.ROWNUMBER + 1) as t
//在ID连续的情况下面可以这样,如果ID连续可以用RowNumber来代替可以实现同样的效果
SELECT a.[id],
a.timea,
a.timeb,
Datediff(second, b.[timea], a.[timeb]) AS TimeSpan
FROM testa a
LEFT JOIN testa b
ON a.[id] = b.[id] + 1
UNION ALL
SELECT Max(a.[id]),
Max(a.timea),
Max(a.timeb),
Avg(Datediff(second, b.[timea], a.[timeb])) AS TimeSpan
FROM testa a
LEFT JOIN testa b
ON a.[id] = b.[id] + 1
select NID,MAX(Time1),MIN(Time2),DATEDIFF(MI,MIN(Time2),MAX(Time1)) as 时间差
from
(
select ID,(case when id%2=0 then ID-1 else id end) as NID,Time1,Time2 from 表A
) t
group by NID