从表中选择行,其中每个订单ID在同一时间位于同一区域

问题描述 投票:0回答:2

我正在寻找选择项,该选择项给我表中的行,其中每个订单ID在同一时间带我尝试了行号和子选择,但不起作用。

  date         time     zone  device  ORDERID
  ..           ..       ..      ..     ..
2019-10-17  17:17:28    B     UN191    1
2019-10-17  16:25:39          UN22     1   
2019-10-17  16:23:44    A     UN194    1
2019-10-17  16:21:36    B     UN195    1
2019-10-17  16:20:25    B     UN197    1
2019-10-17  16:19:04    A     UN194    1
2019-10-17  16:18:26    B     UN195    1
2019-10-17  16:16:59    B     UN195    1
2019-10-17  12:14:23          UN22     1
2019-10-17  12:12:50    A     UN196    1
2019-10-17  11:53:10    B     UN195    1
2019-10-17  08:35:00          UN22     1
2019-10-17  08:33:55    A     UN194    1 
2019-10-17  08:32:52    A     UN190    1
..           ...        ..    ..       ..

结果应该像

  date_start         time_start     zone_start  device_start   date_end         time_end    zone_end  device_end  ORDERID
  ..                   ..              ..         ..             ..                  ..       ..         ..         ..     
2019-10-17           16:20:25          B         UN197         2019-10-17        16:21:36       B       UN195        1      
2019-10-17           16:16:59          B         UN195         2019-10-17        16:18:26       B       UN195        1 
2019-10-17           08:32:52          A         UN190         2019-10-17        08:33:55       A       UN194        1
..                     ...            ..            ..            ..                 ..         ..       ..         ..
sql sql-server gaps-and-islands
2个回答
0
投票

这是空白和岛屿问题的一种变体。可以通过将整个表中的记录等级与具有相同orderidzone的一组记录中的等级进行比较,然后进行汇总来节省成本。]

这里的一种特殊性是,您需要从开始和结束记录中获取设备:为此,我使用了内联查询。

考虑:

select 
    min(datetime) date_start,
    (select device from mytable t1 where cast(date as datetime) + cast(time as datetime) = min(t.datetime)) device_start,
    max(datetime) date_end,
    (select device from mytable t1 where cast(date as datetime) + cast(time as datetime) = max(t.datetime)) device_end,
    orderid,
    zone
from (
    select 
        t.*,
        cast(date as datetime) + cast(time as datetime) datetime,
        row_number() over(order by date, time) rn1,
        row_number() over(partition by orderid, zone order by date, time ) rn2
    from mytable t
) t
group by orderid, zone, rn1 - rn2
order my date_start desc

注意:您为什么在地球上将日期和时间存储在两个不同的列中?当您需要实际比较日期时间时,这会使事情变得更加复杂。查询以datetime数据类型的形式在单列中返回日期和时间。

而且,您不需要2列zone_startzone_end:由于它们属于您的分组列,因此它们将始终相同。

Demo on DB Fiddle

date_start | device_start | date_end | device_end |订单号|区:------------------ | :----------- | :------------------ | :--------- | ------:| :---17/10/2019 16:20:25 | UN197 | 17/10/2019 16:21:36 | UN195 | 1 |乙17/10/2019 16:16:59 | UN195 | 17/10/2019 16:18:26 | UN195 | 1 |乙17/10/2019 08:32:52 | UN190 | 17/10/2019 08:33:55 | UN194 | 1 |一种

0
投票

当相邻行中有两个以上区域时,您似乎想要给定区域的最早行。

© www.soinside.com 2019 - 2024. All rights reserved.