【问题标题】:SQL join category from timeline into timestamp tableSQL 将类别从时间线连接到时间戳表
【发布时间】:2017-10-01 17:13:35
【问题描述】:

考虑以下结构:

create table timestamps(id int, stamp timestamp);
insert into timestamps values
(1,'2017-10-01 10:05:01'),
(2,'2017-10-01 11:05:01'),
(3,'2017-10-01 12:05:01'),
(4,'2017-10-01 13:05:01');

create table category_timeline(begin timestamp,end timestamp, category varchar(100));
insert into category_timeline values
('2017-10-01 10:01:03','2017-10-01 12:01:03','Cat1'),
('2017-10-01 12:01:03','2017-10-01 12:42:43','Cat3'),
('2017-10-01 12:42:43','2017-10-01 14:01:03','Cat2');

同样的Sqlfiddle:SQL Fiddle

我有两张表,一张 (timestamps) 包含时间戳,一张 (category_timeline) 包含类别时间线,也就是说,我们假设 category_timeline 中的记录形成一个连续的非重叠时间线,分配一个分类到每个时间段。

我想将类别分配给timestamps 表,结果是:

| id |                stamp | category |
|----|----------------------|----------|
|  1 | 2017-10-01T10:05:01Z |     Cat1 |
|  2 | 2017-10-01T11:05:01Z |     Cat1 |
|  3 | 2017-10-01T12:05:01Z |     Cat3 |
|  4 | 2017-10-01T13:05:01Z |     Cat2 |

这是以下查询的结果:

SELECT id, stamp, category FROM timestamps ts 
LEFT JOIN category_timeline tl 
ON   ts.stamp >= tl.begin 
AND  ts.stamp < tl.end

但是,一旦表变大,此操作似乎会以指数方式变慢,是否有更好的方法来做到这一点,假设任何时间戳都只落在另一个表中的唯一时期内。

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    我会建议这种方法:

    SELECT ts.id, ts.stamp, 
           (SELECT tl.category
            FROM category_timeline tl 
            WHERE tl.end > ts.stamp
            ORDER BY tl.end ASC
            LIMIT 1
           ) as category
    FROM timestamps ts ;
    

    确保您在category_timeline(end, category) 上有一个索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 2019-03-31
      • 2012-01-21
      • 2021-06-21
      • 2016-03-18
      • 2020-10-29
      相关资源
      最近更新 更多