我有一张桌子看起来是这样的

event_d event_lcl_ts location_id event_code container_id
4/6/24 2024-04-06T10:19:32.133+00:00 1 PUTAWAY asdjhdf-323
4/6/24 2024-04-06T21:52:35.019+00:00 1 RECEIVE asdjhdf-323
4/7/24 2024-04-07T00:13:17.496+00:00 1 PUTAWAY asdjhdf-323
4/7/24 2024-04-07T12:35:54.766+00:00 1 RECEIVE asdjhdf-323
4/7/24 2024-04-07T16:27:13.245+00:00 1 PUTAWAY asdjhdf-323
4/8/24 2024-04-08T22:56:19.038+00:00 1 RECEIVE asdjhdf-323
4/9/24 2024-04-09T00:19:47.575+00:00 1 PUTAWAY asdjhdf-323
4/10/24 2024-04-10T20:44:12.190+00:00 1 RECEIVE asdjhdf-323
4/11/24 2024-04-11T01:14:45.466+00:00 1 PUTAWAY asdjhdf-323
4/11/24 2024-04-11T10:14:12.709+00:00 1 RECEIVE asdjhdf-323
4/11/24 2024-04-11T12:57:11.640+00:00 1 PUTAWAY asdjhdf-323

我正在try 创建一行,其中显示接收容器然后收起时的时间戳,该时间戳基于event_code.此数据的一个警告是,根据提取的数据的时间范围,在某些情况下,PUTAWAY事件将被填充,而没有其之前的RECEIVE事件.也可能存在PUTAWAY事件在最近的RECEIVE事件中尚未发生的情况.

在这种情况下,理想输出是这样的:

container_id receive_timestamp putaway_timestamp location_id
asdjhdf-323 2024-04-06T21:52:35.019+00:00 2024-04-07T00:13:17.496+00:00 1
asdjhdf-323 2024-04-07T12:35:54.766+00:00 2024-04-07T16:27:13.245+00:00 1
asdjhdf-323 2024-04-08T22:56:19.038+00:00 2024-04-09T00:19:47.575+00:00 1
asdjhdf-323 2024-04-10T20:44:12.190+00:00 2024-04-11T01:14:45.466+00:00 1
asdjhdf-323 2024-04-11T10:14:12.709+00:00 2024-04-11T12:57:11.640+00:00 1

如何在忽略或过滤RECEIVE之前可能有PUTAWAY个事件的情况时做到这一点?在这种情况下-第一行.谢谢!

推荐答案

如果您确定行始终交错,那么您可以只使用LAGLEAD.

SELECT
  t.container_id,
  t.event_lcl_ts AS receive_timestamp,
  t.putaway_timestamp,
  t.location_id
FROM (
    SELECT t.*,
      LEAD(CASE WHEN t.event_code = 'PUTAWAY' THEN t.event_lcl_ts END)
        OVER (PARTITION BY t.location_id, t.container_id ORDER BY t.event_lcl_ts) AS putaway_timestamp
    FROM YourTable AS t
) AS t
WHERE t.event_code = 'RECEIVE';

Sql相关问答推荐

SQL Google Sheets:UNIQUE/DISTINCT和编码查询函数

无效和不匹配的计数

基于多个字段删除Access中的重复记录,同时保留最低优先级

PostgreSQL:使用JSONB中的字段使用jsonb_to_Records()填充记录

SQL SELECT MOST NEST TIMESTAMP BEAT ORDER

如何将`now()`作为SQL插入语句的一部分?

如何使用SQL生成数据的滚动3天总和

从重复值中获取最新值

同时插入和更新记录

从另一个没有公共键的表中获取值来加入

group by 并根据同表中其他列的某些条件获取 group by 中的某一列值

确定小数中使用的精度位数

如何在sparksql查询中使用日期值?

标量子查询中的窗口函数不起作用

每个ID的SQL返回可能的最低级别及其值

添加一列并根据其他列值进行填充

使用标准SQL 触发更新当前日期

为什么 Oracle 在一个查询中对同一张表同时执行 TABLE SCAN 和 INDEX UNIQUE SCAN?

在 sql 中合并系列以删除重复项

ACCESS SQL - 有没有办法使用通配符仅 Select 字段的特定部分?