好久没写SQL,请各位C友帮忙看看!

fa_ge 2012-01-11 08:53:48

CREATE TABLE #([type] varchar(10),[date] datetime,value int)
INSERT INTO #
SELECT 'fault','2010-01-02 09:01:00',null UNION ALL
SELECT 'stop','2010-01-02 09:02:00',null UNION ALL
SELECT 'running','2010-01-02 09:03:00',null UNION ALL
SELECT 'fault','2010-01-02 09:04:00',null UNION ALL
SELECT 'fault','2010-01-02 09:04:00',null UNION ALL
SELECT 'stop','2010-01-02 09:05:00',null UNION ALL
SELECT 'block','2010-01-02 09:06:00',null UNION ALL
SELECT 'running','2010-01-02 09:06:00',null UNION ALL
SELECT 'fault','2010-01-02 09:08:00',null UNION ALL
SELECT 'fault','2010-01-02 09:11:00',null


我想得到以下结果

type date next_date value value1
---------- ------------------------------------------------------ ----------- ----------- ----------- ------------
fault 2010-01-02 09:01:00.000 2010-01-02 09:02:00.000 1 2
stop 2010-01-02 09:02:00.000 2010-01-02 09:03:00.000 1 2
running 2010-01-02 09:03:00.000 2010-01-02 09:04:00.000 1 1
fault 2010-01-02 09:04:00.000 2010-01-02 09:05:00.000 1 4
fault 2010-01-02 09:04:00.000 2010-01-02 09:05:00.000 1 4
stop 2010-01-02 09:05:00.000 2010-01-02 09:06:00.000 1 4
block 2010-01-02 09:06:00.000 2010-01-02 09:08:00.000 2 4
running 2010-01-02 09:06:00.000 2010-01-02 09:08:00.000 2 2
fault 2010-01-02 09:08:00.000 2010-01-02 09:11:00.000 3 3
fault 2010-01-02 09:11:00.000 NULL NULL 3

...全文
169 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿斯顿的 2012-06-15
  • 打赏
  • 举报
回复
鹤哥,之前看你回复的一个帖子中 关于撤销SQl的上一次操作 中说到 :

insert into t
select * from deleteed

不知道里面的T 和deleted代表什么意思呢? 麻烦指教下哈。
fa_ge 2012-01-12
  • 打赏
  • 举报
回复
一天没来,居然没有回复!
fa_ge 2012-01-11
  • 打赏
  • 举报
回复
这个SQL也烦了我一下午了,我还要改成oracle语法。

上班不能回贴,所以明天晚点来。
fa_ge 2012-01-11
  • 打赏
  • 举报
回复
树哥,不错。我初步看了下,应该是可以的。
只是效率有待改,太慢了。我数据量大。先谢谢了
百年树人 2012-01-11
  • 打赏
  • 举报
回复
我开始直接用时间相减了,修改了一下再试试
;with t1 as(
select rn=row_number() over(order by date),type,date,
next_date=(select top 1 date from # where date>t.date order by date),
value=datediff(mi,date,(select top 1 date from # where date>t.date order by date)),
date1=
case when type='running' then
(select top 1 date from # where date>t.date and type!='running' order by date)
else
isnull((select top 1 date from # where date>=t.date and type='running' order by date),(select max(date) from #))
end
from # t
) ,
t2 as(
select type,date,next_date,value,date1,
value0=case when exists(select 1 from t1 where date1=t.date1 and date=t.date and rn<t.rn) then 0 else value end
from t1 t
)
select type,date,next_date,value,
value1=(select sum(value0) from t2 where date1=t.date1) from t2 t

/**
type date next_date value value1
---------- ----------------------- ----------------------- ----------- -----------
fault 2010-01-02 09:01:00.000 2010-01-02 09:02:00.000 1 2
stop 2010-01-02 09:02:00.000 2010-01-02 09:03:00.000 1 2
running 2010-01-02 09:03:00.000 2010-01-02 09:04:00.000 1 1
fault 2010-01-02 09:04:00.000 2010-01-02 09:05:00.000 1 4
fault 2010-01-02 09:04:00.000 2010-01-02 09:05:00.000 1 4
stop 2010-01-02 09:05:00.000 2010-01-02 09:06:00.000 1 4
block 2010-01-02 09:06:00.000 2010-01-02 09:08:00.000 2 4
running 2010-01-02 09:06:00.000 2010-01-02 09:08:00.000 2 2
fault 2010-01-02 09:08:00.000 2010-01-02 09:11:00.000 3 3
fault 2010-01-02 09:11:00.000 NULL NULL 3

(10 行受影响)
**/
fa_ge 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 josy 的回复:]
SQL code
;with t1 as(
select type,date,
next_date=(select top 1 date from # where date>t.date order by date),
value=datediff(mi,date,(select top 1 date from # where date>t.date order by date)),
d……
[/Quote]

树哥,我给的结果是没有错的。


fault 2010-01-02 09:04:00.000 2010-01-02 09:05:00.000 1 2
fault 2010-01-02 09:04:00.000 2010-01-02 09:05:00.000 1 2
stop 2010-01-02 09:05:00.000 2010-01-02 09:06:00.000 1 2
block 2010-01-02 09:06:00.000 2010-01-02 09:08:00.000 2 2

前两个是重复的,只能算 1 。所以 1+1+2=4.是这样来的


百年树人 2012-01-11
  • 打赏
  • 举报
回复
;with t1 as(
select type,date,
next_date=(select top 1 date from # where date>t.date order by date),
value=datediff(mi,date,(select top 1 date from # where date>t.date order by date)),
date1=
case when type='running' then
(select top 1 date from # where date>t.date and type!='running' order by date)
else
isnull((select top 1 date from # where date>=t.date and type='running' order by date),(select max(date) from #))
end
from # t
)
select type,date,next_date,value,value1=datediff(mi,(select top 1 date from t1 where date1=t.date1 order by date),date1)
from t1 t
order by date

/**
type date next_date value value1
---------- ----------------------- ----------------------- ----------- -----------
fault 2010-01-02 09:01:00.000 2010-01-02 09:02:00.000 1 2
stop 2010-01-02 09:02:00.000 2010-01-02 09:03:00.000 1 2
running 2010-01-02 09:03:00.000 2010-01-02 09:04:00.000 1 1
fault 2010-01-02 09:04:00.000 2010-01-02 09:05:00.000 1 2
fault 2010-01-02 09:04:00.000 2010-01-02 09:05:00.000 1 2
stop 2010-01-02 09:05:00.000 2010-01-02 09:06:00.000 1 2
block 2010-01-02 09:06:00.000 2010-01-02 09:08:00.000 2 2
running 2010-01-02 09:06:00.000 2010-01-02 09:08:00.000 2 2
fault 2010-01-02 09:08:00.000 2010-01-02 09:11:00.000 3 3
fault 2010-01-02 09:11:00.000 NULL NULL 3

(10 行受影响)
**/

中间有一段value1为2,但你给的值是4,不知道是不是理解错了
Spade_J 2012-01-11
  • 打赏
  • 举报
回复
看懂了。。。但是感觉无从下手 囧
liangCK 2012-01-11
  • 打赏
  • 举报
回复
哦。排除重复的?
fa_ge 2012-01-11
  • 打赏
  • 举报
回复
如下面就是重复的,所以算 value1时,不能重算,


fault 2010-01-02 09:04:00.000 2010-01-02 09:05:00.000 1 4
fault 2010-01-02 09:04:00.000 2010-01-02 09:05:00.000 1 4



fa_ge 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 josy 的回复:]
value1:是这样的,以状态running 为界,连继的 stop,block持续的时间。

-----------
其他都好算,value1的值没看懂,fault的值怎么算?
[/Quote]

树哥,我没有说清楚,fault,stop,block等都属于同一类型停机,也就是说这表就两种类型。一种是 running运行的,除了running 之外的都是停机类型。现在就统计这两种大类的持续时间。
有一点是,时间有可能重复,所以不能算重。
liangCK 2012-01-11
  • 打赏
  • 举报
回复

好久不写了。next_date都有些看不懂。
fa_ge 2012-01-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liangck 的回复:]
鹤兄,好久不见了。
[/Quote]

小梁好久不见,当爸爸了吧。
liangCK 2012-01-11
  • 打赏
  • 举报
回复
鹤兄,好久不见了。
百年树人 2012-01-11
  • 打赏
  • 举报
回复
value1:是这样的,以状态running 为界,连继的 stop,block持续的时间。

-----------
其他都好算,value1的值没看懂,fault的值怎么算?
fa_ge 2012-01-11
  • 打赏
  • 举报
回复
现在CSDN没有抢分了?发个贴都没有人顶下
fa_ge 2012-01-11
  • 打赏
  • 举报
回复
我解释下:

next_date:是指这个状态下一个 date
value :就是这两个相减,得到的分钟

value1:是这样的,以状态running 为界,连继的 stop,block持续的时间。


34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧