读书人

复杂查询()

发布时间: 2012-03-03 15:33:03 作者: rapoo

高手请进,复杂查询(在线等)
我有一个flow表,里面有个name,starttime,flowtype字段,其中flowtype这个字段的值有:跑出,跳出,走出,跑进,跳进,走进。
name starttime flowtype
兔子 2007-07-05 10:22:00 跑出
老虎 2007-07-05 11:22:00 跑进
兔子 2007-07-06 10:45:00 跑进


我现在要根据指定的name,将“跑出”所对应的第一条“进”的状态合并为一条记录。
比如:
兔子 2007-07-05 10:22:00 跑出 2007-07-06 10:45:00 跑进

[解决办法]
select a.name, a.starttime ,a.flowtype, min(b.flowtype)
from flow a left join flow b
on a.name = b.name and a.starttime <b.starttime
group by a.name, a.starttime ,a.flowtype
[解决办法]
select a.*,c.flow_type
from(
select a.name, a.starttime ,a.flowtype, min(b.starttime) in_time
from flow a left join (select * from flow where flowtype like '%进 ')b
on a.name = b.name and a.starttime <b.starttime
where a.name= '兔子 '
group by a.name, a.starttime ,a.flowtype
) a
join flow c on a.name=c.name and a.in_time=c.in_time

[解决办法]
-- 我这写了一个,超复杂,最好你把它简化一下改造成函数比较好
declare @table table([name] nvarchar(10),starttime datetime,flowtype nvarchar(2))
insert @table
select N '兔子 ', '2007-07-05 10:22:00 ',N '跑出 ' union all
select N '老虎 ', '2007-07-05 11:22:00 ',N '跑进 ' union all
select N '兔子 ', '2007-07-06 10:45:00 ',N '跑进 ' union all
select N '老虎 ', '2007-07-06 12:00:00 ',N '走出 ' union all
select N '老虎 ', '2007-07-06 12:40:00 ',N '跳进 '

select aa.name,aa.outtime,aa.out_put,aa.intime,bb.in_put
from
(select a.name,a.outtime,a.out_put,dateadd(minute,a.diff,a.outtime)as intime
from
(select OUT_PUT.name,OUT_PUT.outtime,OUT_PUT.out_put,
min(datediff(minute,OUT_PUT.outtime,IN_PUT.intime))as diff
from
(select name,starttime as outtime,flowtype as out_put
from @table
where flowtype in( '走出 ', '跑出 ', '跳出 '))OUT_PUT
inner join
(select name,starttime as intime,flowtype as in_put
from @table
where flowtype in( '走进 ', '跑进 ', '跳进 '))IN_PUT

on OUT_PUT.name=IN_PUT.name AND OUT_PUT.outtime <IN_PUT.intime

group by OUT_PUT.name,OUT_PUT.outtime,OUT_PUT.out_put)a )aa
inner join
(select name,starttime as intime,flowtype as in_put
from @table
where flowtype in( '走进 ', '跑进 ', '跳进 '))bb
on aa.name=bb.name and aa.intime=bb.intime



[解决办法]
--建立测试环境
create table 表1
([name] nvarchar(10),starttime datetime,flowtype nvarchar(2))
GO
insert 表1
select N '兔子 ', '2007-07-05 10:22:00 ',N '跑出 ' union all
select N '老虎 ', '2007-07-05 11:22:00 ',N '跑进 ' union all


select N '兔子 ', '2007-07-06 10:45:00 ',N '跑进 ' union all
select N '老虎 ', '2007-07-06 12:00:00 ',N '跑出 ' union all
select N '老虎 ', '2007-07-06 12:40:00 ',N '跳进 '
GO
select * from 表1
GO

--测试
select a.*,b.starttime endtime,b.flowtype flowtypb,b.starttime-a.starttime timecout,IDENTITY(int,1,1) ID into #
from 表1 a inner join 表1 b on a.NAME=B.NAME and b.starttime-a.starttime> = '1900-01-01 00:00:00.000 '
AND A.FLOWTYPE= '跑出 ' AND B.FLOWTYPE LIKE '%进 '

select a.* from # a inner join
(select name,starttime,min(timecout) timecout from # group by name,starttime
) as b on a.name=b.name and a.starttime=b.starttime and a.timecout=b.timecout


[解决办法]
我是这样分析的:一个动物有N多个“时间”有N多个“进出”,一个“出”对应时间最近的“进”。
所以我们选择要查询出动物的出和出的时间,再根据出和出的时间去寻找时间最近的进。
如果进与出是相同记录数,而一比一对应,那么就比较好办:
select name,starttime,flowtype,
(select min(starttime) from flow f where right(flowtype,1)= '进 ' and f.starttime> =a.starttime and f.name=a.name)endtime,
left(flowtype,1)+ '进 ' endflowtype
from
(select name,starttime,flowtype from flow where right(flowtype,1)= '出 ') a

我都在SQL SERVER里面建表试过了。绝对可行,不给分,就跟小芳死过

至于进出不是一比一的对应关系,估计写法会复杂一点,相信小芳自己想想就会明白的。

读书人网 >SQL Server

热点推荐