项目从交易中返回的持续时间,多对多,SQL

问题描述 投票:-1回答:1

希望我能在此上得到一些帮助。

情况

有两个传入站和一个传出站。扫描项目进出。我需要知道物品在车站多久了。让我们将“在站中”视为它的传入日期扫描和传出日期扫描之间的时间。

问题

  1. 一个项目可以(偶然地)扫描到任一站中多次(为此,我正在考虑确定是否在同一天(不看小时)进行扫描,然后返回最早扫描的时间)

  2. 物品可以多次从工作站中出来(多次进出扫描)

  3. 如果将一个项目扫描到两个接收位置,则需要最早的时间

数据样本。.我们去的地方

╔═════════╦════════╦══════════════════╦════════════════╦══════════╗
║ 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            |
+--------+-----------------+------------------+-----------------+
sql sql-server sorting join many-to-many
1个回答
0
投票

这是一个孤岛问题。一种方法是使用累积总和来定义组,累积总和对于每个传入记录都是递增的,并将其用于聚合:

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
    
© www.soinside.com 2019 - 2024. All rights reserved.