【问题标题】:SQL Finding the first event and then the closing event after itSQL 查找第一个事件,然后查找它之后的结束事件
【发布时间】:2021-03-10 17:22:56
【问题描述】:

我正在尝试编写一些 SQL 查询,但到目前为止还没有运气。 我想在示例中接收每个事件的 event_start 和 event_end(不幸的是,没有 event_id!)

输入

event_timestamp event_date customer_ID event_name
2021-02-07 16:18:18.000000 2021-02-07 1234567 event_start
2021-02-07 16:34:44.000000 2021-02-07 1234567 event_end
2021-02-07 16:49:08.000000 2021-02-07 1234567 event_start
2021-02-07 17:04:35.000000 2021-02-07 1234567 event_end
2021-02-07 17:19:46.000000 2021-02-07 1234567 event_start
2020-09-28 09:37:09.000000 2020-09-28 7654321 event_start
2020-09-28 09:52:08.000000 2020-09-28 7654321 event_start
2020-09-28 13:15:17.000000 2020-09-28 7654321 event_end

逻辑如下:

  • 如果 event_end 正好在 event_start 之后,则接收 event_start 的时间戳作为开始,接收后续 event_end 的时间戳作为结束
  • 如果在 event_end 之前有多个 event_start,则接收第一个 event_start 的时间戳作为开始,并接收结束此 event_start 循环的 event_end 的时间戳
  • 如果 event_start 后面没有 event_end(对于指定的日期和 ID),则 event_end = 23:59:59 将在同一天晚上到期

我认为我应该使用某种窗口函数,但我似乎无法弄清楚究竟是什么以及如何!

任何帮助将不胜感激!

基本上新表应该是这样的:

customer_ID event_date start end
1234567 2021-02-07 2021-02-07 16:18:18.000000 2021-02-07 16:34:44.000000
1234567 2021-02-07 2021-02-07 16:49:08.000000 2021-02-07 17:04:35.000000
1234567 2021-02-07 2021-02-07 17:19:46.000000 2021-02-07 23:59:59.000000
7654321 2020-09-28 2020-09-28 09:37:09.000000 2020-09-28 13:15:17.000000

【问题讨论】:

  • 您能否将您的输入和结果作为文本而不是链接图像放入问题中?用图像做任何事情都非常困难。
  • 我删除了不一致的数据库标签。请标记您真正使用的数据库。
  • 对不起,第一次……我希望现在更好

标签: sql postgresql


【解决方案1】:

我的诚实意见是修复数据模型......找到一些方法来指定一个不同的事件。我认为你可以想出一些技巧,但我很难相信你能找到一种足够防弹的技巧来抵御非结构化数据的可能性。

也就是说,本着试图提供帮助的精神,这里有这样一个技巧。实际上,我试图通过创建一个人工 event_id(在event_data CTE 中)来猜测是什么将两条记录绑定在一起。假设做得正确,第二部分应该非常有效。

with event_data as (
  select
    event_timestamp, event_date, customer_id, event_name,
    sum (1) filter (where event_name = 'event_start') 
        over (partition by customer_id order by event_timestamp) as event_id 
  from events
)
select
  e1.event_id, e1.customer_id, e1.event_date,
  e1.event_timestamp as start,
  coalesce (e2.event_timestamp, date_trunc ('day', e1.event_timestamp) + interval '23:59:59') as end
from
  event_data e1
  left join event_data e2 on
    e1.customer_id = e2.customer_id and
    e1.event_id = e2.event_id and
    e2.event_name = 'event_end'
where
  e1.event_name = 'event_start'

结果与您的结果数据集不完全匹配,但是当您看到输出时,它可能会给出为什么会这样的想法......您甚至可能同意修改后的输出。

【讨论】:

  • 对不起,我正在使用 Redshift。我应该提到这一点,但无论如何 sum (1) filter (where event_name = 'event_start') ` 不起作用,但我明白了你的想法。最好的方法确实是结构化数据,这基本上是困难的部分。谢谢
猜你喜欢
  • 2020-09-22
  • 1970-01-01
  • 2021-11-08
  • 2012-06-25
  • 2021-08-20
  • 1970-01-01
  • 2012-03-15
  • 2019-11-11
  • 2019-01-27
相关资源
最近更新 更多