【问题标题】:T-SQL Group/combine recordsT-SQL 分组/组合记录
【发布时间】:2015-02-27 17:09:15
【问题描述】:

我有一个活动表,它包含“开始”和(以及许多其他)“结束”事件。

person, datetime, event
1, 2015-01-1 13:30, start
2, 2015-01-1 13:33, start
3, 2015-01-1 13:38, start
2, 2015-01-1 13:57, end
1, 2015-01-1 14:03, end
1, 2015-01-1 14:07, start
1, 2015-01-1 14:12, end

我希望像这样检索它们:

person, start, end
1, 2015-01-01 13:30, 2015-01-01 14:03
1, 2015-01-01 14:07, 2015-01-01 14:12
2, 2015-01-01 13:33, 2015-01-01 13:57
3, 2015-01-01 13:38, null

我似乎无法将关键字放在一起以找到这种“组合行”机制或类似场景。

【问题讨论】:

  • 时间是什么数据类型?
  • 你在 mysql 或 SQL Server 上使用什么数据库?
  • 对不起,我想通了,这是一个简单的子查询 top 1,我在 T-SQL 中创建了示例,但它也可以在 MySQL 中稍作修改。

标签: mysql sql tsql group-by


【解决方案1】:

没有子查询

SELECT startevent.person_id as person, 
       startevent.datetime as [start],
       min(endevent.datetime) as [end]
  FROM person_events as startevent 
  join person_events as endevent 
    on startevent.person_id = endevent.person_id 
   and startevent.event = 'start'
   and endevent.event =   'end'
   and startevent.datetime < endevent.datetime
 GROUP BY startevent.person_id, startevent.datetime
 ORDER BY startevent.person_id, startevent.datetime

【讨论】:

    【解决方案2】:

    对不起,解决方案非常简单。我把事情复杂化了!

    SELECT
        startevent.person_id as person,
        startevent.datetime as [start],
        (
            SELECT TOP 1
                endevent.datetime as [end]
            FROM
                person_events as endevent
            WHERE
                endevent.event = 'end'
            AND
                endevent.datetime >= startevent.datetime
            ORDER BY
                endevent.person_id,
                endevent.datetime
        ) as [end]
    FROM
        person_events as startevent
    WHERE
        event = 'start'
    ORDER BY
        startevent.person_id,
        startevent.datetime
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 2014-10-08
      • 2023-03-11
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多