希望我能在此上得到一些帮助。
情况
有两个传入站和一个传出站。扫描项目进出。我需要知道物品在车站多久了。让我们将“在站中”视为它的传入日期扫描和传出日期扫描之间的时间。
问题
一个项目可以(偶然地)扫描到任一站中多次(为此,我正在考虑确定是否在同一天(不看小时)进行扫描,然后返回最早扫描的时间)
物品可以多次从工作站中出来(多次进出扫描)
如果将一个项目扫描到两个接收位置,则需要最早的时间
数据样本。.我们去的地方
╔═════════╦════════╦══════════════════╦════════════════╦══════════╗
║ Row_num ║ ItemID ║ Dates ║ LocationName ║ Type ║
╠═════════╬════════╬══════════════════╬════════════════╬══════════╣
║ 1 ║ ItemA ║ 1/7/20 12:49 PM ║ Outgoing_Loc ║ Outgoing ║
║ 2 ║ ItemA ║ 1/2/20 7:29 AM ║ Incoming_Loc_A ║ Incoming ║
║ 3 ║ ItemB ║ 1/3/20 11:01 AM ║ Outgoing_Loc ║ Outgoing ║
║ 4 ║ ItemB ║ 1/2/20 4:57 PM ║ Incoming_Loc_B ║ Incoming ║
║ 5 ║ ItemB ║ 1/2/20 5:01 PM ║ Incoming_Loc_A ║ Incoming ║
║ 6 ║ ItemB ║ 12/12/19 5:58 PM ║ Outgoing_Loc ║ Outgoing ║
║ 7 ║ ItemB ║ 12/12/19 5:57 PM ║ Outgoing_Loc ║ Outgoing ║
║ 8 ║ ItemB ║ 5/20/19 10:19 AM ║ Outgoing_Loc ║ Outgoing ║
║ 9 ║ ItemC ║ 1/9/20 9:20 AM ║ Outgoing_Loc ║ Outgoing ║
║ 10 ║ ItemC ║ 1/2/20 6:42 PM ║ Incoming_Loc_A ║ Incoming ║
║ 11 ║ ItemC ║ 12/20/19 5:54 AM ║ Outgoing_Loc ║ Outgoing ║
║ 12 ║ ItemC ║ 10/10/19 6:13 PM ║ Outgoing_Loc ║ Outgoing ║
║ 13 ║ ItemC ║ 10/5/19 7:00 PM ║ Incoming_Loc_A ║ Incoming ║
║ 14 ║ ItemC ║ 7/16/19 9:18 AM ║ Outgoing_Loc ║ Outgoing ║
╚═════════╩════════╩══════════════════╩════════════════╩══════════╝
我试图将各种类型的问题提供到分配给不同项的表中。
完美的交易是ItemA,它是如此简单和干净,如果它们都是这样,那么我可以将表加入并拉到单独的列上。
ItemB,您会注意到此文件已扫描到两个传入位置,但我只需要返回一个-它最早来自该批次。另外,需要返回最旧的传出(12/12/19)之后和最后的传出(1/3/20)之前的传入。
ItemC,类似于ItemB的最后一条语句,该项目两次从位置进出。需要获取按时间顺序最有意义的传入和传出对。
我不知道这很难解决,但是我很难找到解决方案。我不确定如何在外发之间挤压外来日期。
输出示例:需要获取每个物品在车站中的天数。如果项目已多次进出,则需要按时间顺序配对最有意义的进货和出货。例如,ItemC具有多个传入和传出日期,但是我只需要具有一对开始和结束的日期。
+--------+-----------------+------------------+-----------------+
| ItemID | Incoming | Outgoing | Days in Station |
+--------+-----------------+------------------+-----------------+
| ItemA | 1/2/20 7:29 AM | 1/7/20 12:49 PM | 5.00 |
| ItemB | 1/2/20 4:57 PM | 1/3/20 11:01 AM | 1.00 |
| ItemC | 1/2/20 6:42 PM | 1/9/20 9:20 AM | 7.00 |
| ItemC | 10/5/19 7:00 PM | 10/10/19 6:13 PM | 5.00 |
+--------+-----------------+------------------+-----------------+
这是一个孤岛问题。一种方法是使用累积总和来定义组,累积总和对于每个传入记录都是递增的,并将其用于聚合:
select
itemID,
min(dates) incoming,
max(dates) outgoing,
datediff(second, min(dates), max(dates)) / 60.0 / 60 / 24 days_in_station
from (
select
t.*,
sum(case when type = 'Incoming' then 1 else 0 end)
over(partition by itemID order by dates) grp
from mytable t
) t
group by itemID, grp