从一个项目的坐席事务中返回该项目的持续时间,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 ║
╚═════════╩════════╩══════════════════╩════════════════╩══════════╝

我试图提供每一种类型的问题成表分布到不同的项目。

完美的交易是 项目A,它是如此的简单和干净,如果他们都是这样的,那么我可以直接连接表格,并将它们拉到单独的列上。

ItemB,你会注意到这个被扫描到两个传入的位置,但我只需要返回一个最早的那批传入的位置。另外,需要返回最老的出库(121219)之后,最后一个出库(1320)之前的入库。

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 join transactions many-to-many
1个回答
0
投票

我不知道你如何能做到这一点,如果不在你的查询中创建额外的表。

如果你不知道他们是相当酷的,将把你的SQL水平到一个新的水平。

SELECT * 
FROM 
    (SELECT * FROM WHERE ...)

至少你会想要以下表:一个显示一个项目是否被扫描过不止一次的表.命令该表为这样的表

表1A.项目;外发次数;DateOrder it by Item and Date desc(最早的日期会显示)。项目;发送次数;日期按项目和日期降序排列(最早的日期将被显示)。

表1BB根据表1A取项目数超过一个的最早日期。

表2A. 项目。入库次数.按项目和日期排序(最早的日期将显示)。

表2B根据表2A取项目数超过一个的最早日期。

用表1B和表2B来推导你的答案。

别人可能会更有耐心,给出更精炼的答案,但希望以上能帮到你。

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