首页 > 解决方案 > SQL:是否有可能过滤两个附加了按时间顺序排列的 CASE 值?

问题描述

我有一个基于扫描数据(仓库)的数据集。我的目标是分析“运动”。例如 BARCODE UNLOAD ,在此之后货件将收到 ASSIGN LOCATION 扫描。为了准确起见,我需要过滤SCAN_EVENT_TYPE + SCAN_LOCATION. 因此,没有计划从 V-14 到 V-02 的移动是(=1 movement to many) but the movement from V-02 -> V-02他们每天早上在仓库中进行的一轮扫描,以检查地板上还有多少件(=不是额外的移动)

https://imgshare.io/image/test.nr6iO

问题如何根据这两个值查找此查询并使用 scan_date 作为对流的检查。

另外,为了让我完全 100% 准确,我需要使用 SCAN_DATE 例如:

FLOW for SHIPMENT A
UNLOAD BARCODE
ASSIGN LOCATION = V-14 08:00
ASSIGN LOCATION = V-02 08:15
ASSIGN LOCATION = V-20 08:30
ASSIGN LOCATION = V-02 08:45

在这种情况下,我想同时查看 V-02 扫描。因为现在 V-20 介于两者之间。

FLOW for SHIPMENT B
UNLOAD BARCODE
ASSIGN LOCATION = V-14 08:00
ASSIGN LOCATION = V-02 08:15
ASSIGN LOCATION = V-02 08:45

在此示例中,我只想查看 1 次 V-02 扫描(1 次扫描来自他们在仓库中进行的早晨轮次)

我尝试过内联选择、MIN、MAX 值等等。但我找不到可靠的解决方案

select 
scal.BARCODE
, scal.SCAN_EVENT_TYPE
, scal.SCAN_DATE
, scal.SCAN_LOCATION
, scal.SCAN_ZONE
, scal.DOCK
, scal.H_ID_ORDER
, scal.ID_GOODS
, scal.SOURCE
from dwh.S_ORD_SCAN_LOCATIONS scal
where scal.BARCODE in
(
select 
scal1.BARCODE
from dwh.S_ORD_SCAN_LOCATIONS scal1
where scal1.SCAN_EVENT_TYPE in ('ASSIGN LOCATION', 'BARCODE LOAD', 'BARCODE UNLOAD')
and year(scal1.scan_date) = 2018
group by scal1.BARCODE,  scal1.SCAN_EVENT_TYPE, scal1.ID_GOODS
having count(scal1.BARCODE) > 2)

order by 1,2,6

我只想查看按条形码、scan_event_type 和 id_goods 分组的收到超过 2 次扫描的条形码

装运 A 的预期结果

UNLOAD BARCODE 
ASSIGN LOCATION = V-14 08:00
ASSIGN LOCATION = V-02 08:15
ASSIGN LOCATION = V-20 08:30
ASSIGN LOCATION = V-02 08:45

在这种情况下,我希望看到 3 个“动作”。从 V-14 到 V-02,从 V-02 到 V-20,从 V-20 到 V-02

  FLOW for SHIPMENT B
    UNLOAD BARCODE
    ASSIGN LOCATION = V-14 08:00
    ASSIGN LOCATION = V-02 08:15
    ASSIGN LOCATION = V-02 08:45

我希望在这里看到 1 个结果。从 V-14 到 V-02(第二个 V-02 被取消)

标签: sqlsql-server

解决方案


推荐阅读