首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在状态基上动态合并行

如何在状态基上动态合并行
EN

Stack Overflow用户
提问于 2016-05-31 07:02:27
回答 2查看 62关注 0票数 0

我想将上的行合并到Location基础上。我想检查一辆车在特定地点停留多长时间。在1内,表示车辆进入特定位置,表示离开特定位置。如果车辆在特定日期进入和离开同一位置,则计算TimeLast。例如,HDBP是车辆进出的地点。

代码语言:javascript
复制
select zs.oId,o.Number,z.Id,z.Location,zs.TimeFirst,zs.inside from zs join
z on zs.Id = z.Id join 
o on zs.oId=o.oId
where z.GroupId in (1094,1095,1096) and CONVERT(Date,TimeFirst)='2016/5/29'
order by zs.oId,zs.TimeFirst

输出

代码语言:javascript
复制
oId    Number   Id       Location            TimeFirst               Inside
1639    0664    1        Hd        2016-05-29 05:48                0
1639    0664    2        Kp        2016-05-29 18:46                1
1640    0359    1        Hd        2016-05-29 13:12                0
1640    0359    1        Hd        2016-05-29 13:42                1
1640    0359    1        Hd        2016-05-29 13:46                0
1643    0812    3        Lr        2016-05-29 11:41                0
1644    0806    4        Mn        2016-05-29 06:56                0
1644    0806    5        Bp        2016-05-29 09:54                1
1644    0806    5        Bp        2016-05-29 17:43                0

预期输出

代码语言:javascript
复制
oId    Number     Id    Location      TimeFirst                TimeLast       
1639    0664      1     Hd        2016-05-29 05:48         
1639    0664      2     Kp        2016-05-29 18:46         
1640    0359      1     Hd        2016-05-29 13:12         
1640    0359      1     Hd        2016-05-29 13:42          2016-05-29 13:46    
1643    0812      3     Lr        2016-05-29 11:41         
1644    0806      4     Mn        2016-05-29 06:56         
1644    0806      5     Bp       2016-05-29 09:54           2016-05-29 17:43    
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-31 12:46:12

在Server 2012上,您可以使用窗口聚合函数laglead来实现这一点,这些函数允许您将数据与上一记录或下一记录中的数据进行比较:

代码语言:javascript
复制
select   oId, Number, Id, Location, TimeFirst,
         CASE WHEN inside = 1 THEN DepartureTime END DepartureTime
from     (  select   zs.oId, o.Number, z.Id, z.Location, zs.TimeFirst, 
                     zs.inside,
                     lag(zs.inside) over (partition by o.oId, z.Id 
                                          order by zs.TimeFirst) as prev_inside,
                     lead(zs.inside) over (partition by o.oId, z.Id
                                           order by zs.TimeFirst) as next_inside,
                     lead(zs.TimeFirst) over (partition by o.oId, z.Id
                                              order by zs.TimeFirst) as DepartureTime
            from     zs 
            join     z on zs.Id = z.Id 
            join     o on zs.oId=o.oId
            where    z.GroupId in (1094,1095,1096) 
            and      CONVERT(Date,TimeFirst)='2016/5/29' 
         ) as base
where    (inside = 1 or coalesce(prev_inside,0) = 0)
order by oId, TimeFirst

SQL小提琴

票数 0
EN

Stack Overflow用户

发布于 2016-05-31 10:04:06

这对你很有帮助:

代码语言:javascript
复制
select  zs.old,o.Number,z.Id,z.Name,zs.Timefirst, (select case when  zs.timefirst  in (select max(Timefirst) from zs group by zs.old ,zs.id) then zs.timefirst else '' end ) as TimeLast from zs join z on zs.Id = z.Id join o on zs.old=o.old order by zs.old,zs.Timefirst 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37538943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档