【问题标题】:How can I consolidate Event-Based Rows in a SQL Query?如何在 SQL 查询中合并基于事件的行?
【发布时间】:2018-12-14 00:13:57
【问题描述】:

我有一个包含以下字段的简单 SQL 表:

  • 事件开始(日期时间)
  • 活动结束(日期时间)
  • 事件描述(varchar)

里面的数据代表了一个连续的时间线,被不同类型的事件打破。每个 [Event End] 都会匹配一个 [Event Start] 字段(如链)。

我的挑战是,有些事件是相同的,例如:

Event Start        Event End          Event Description
1/1/2018 07:00:00  1/1/2018 07:30:00  Breakfast
1/1/2018 07:30:00  1/1/2018 07:40:00  Drive To Work
1/1/2018 07:40:00  1/1/2018 07:55:00  Drive To Work
1/1/2018 07:55:00  1/1/2018 12:00:00  Working

但我想要一个可以显示如下视图的 SQL 查询:

Event Start        Event End          Event Description
1/1/2018 07:00:00  1/1/2018 07:30:00  Breakfast
1/1/2018 07:30:00  1/1/2018 07:55:00  Drive To Work
1/1/2018 07:55:00  1/1/2018 12:00:00  Working

在我的表中,我可以有超过 2 个事件需要合并到一行中,以防您想知道我们是否只能做一个简单的 JOIN 并解决问题,可能需要应用递归方法,但我不知该如何。你知道如何构建 SQL 查询吗?

【问题讨论】:

  • 你的列名中真的有空格吗?
  • 不,为了简单起见,上面的示例丢弃了与此挑战无关的真实字段名称和其他字段。如果需要,您可以提供带有其他字段名称的查询。
  • 处理真实的表名和列名通常更容易。如果问题比上面看到的更复杂,那么您的示例可能过于简化。

标签: sql-server


【解决方案1】:

你可以这样做:

select
      "Event Description"
    , min("Event Start") as "Event Start"
    , max("Event End") as "Event End"
from that_table
group by
      "Event Description"

但是仅依赖于描述可能是一个严重的问题,例如拼写错误或只是意外的多个空格可能会导致您没有预料到的差异 - 或者重复的描述可能会导致任务“加入”不应该加入。

【讨论】:

  • 感谢您的建议;我同意描述的实质性问题,并且在真实表格中,我有一个解决该问题的类别 ID。正如我之前所说,我只是想提供有关我正在寻找的内容的背景信息。您提出的查询没有考虑我可以在中间有不同类型的事件的事实。无论是否有事件将它们分开,您的提案都会对所有开车上班事件进行分组。规则是只合并连续的事件。
  • 如果表格中有更多详细信息,请使用该详细信息。只能根据所呈现的事实提供帮助......
  • 您的提案会将所有开车上班的事件分组,无论是否有事件将它们分开。规则是仅合并连续事件。 请定义“连续”。 如果您试图暗示行的顺序很重要,那么:表中的哪些列产生所需的顺序?(即更多详细信息需要你的桌子)
  • 事件开始和事件结束列对于这个问题至关重要。该表必须按事件开始排序,才能按时间顺序查看该表。目标是对紧随其后发生的相同类型的重复事件进行分组。如果我使用 group by 表达式,所有事件都将被分组,无论它们发生在不同事件之后还是之前。
  • 搜索“差距和岛屿”。您的最新评论表明您正在寻找“岛屿”。但是您的样本数据可能不足以解释您的实际问题。
猜你喜欢
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2011-02-20
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多