我正在寻找选择项,该选择项给我表中的行,其中每个订单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
.. ... .. .. .. .. .. .. ..
这是空白和岛屿问题的一种变体。可以通过将整个表中的记录等级与具有相同orderid
和zone
的一组记录中的等级进行比较,然后进行汇总来节省成本。]
这里的一种特殊性是,您需要从开始和结束记录中获取设备:为此,我使用了内联查询。
考虑:
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_start
和zone_end
:由于它们属于您的分组列,因此它们将始终相同。
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 |一种
当相邻行中有两个以上区域时,您似乎想要给定区域的最早行。