sql查询根据开始和结束时间查找不同的条目

时间:2014-02-21 19:12:52

标签: sql

visit
tid     pid    date 
112   45   12-03-12
124   12   13-04-03
112   32   12-03-12
421   14   14-01-31

place
pid   start  end     starttime   endtime
45    xyz    qwe     12:00:13   14:30:00
12    abc    yst     15:45:00   16:00:00
32    tyu    jkf     15:30:00   17:30:00
14    nyk    por     08:30:00   10:00:50

我很难过这件事。我知道一点点和零件,但我无法将它们全部融合在一起。我需要如下结果

tid    start  end
112    xyz    jfk
124    abc    yst
421    nyk    por

如图所示,我需要在同一天只派出一个票证实例。但我需要根据时间开始和结束的地方。 start应该具有最早的实例,同时根据startime和endtime结束最新的实例。

2 个答案:

答案 0 :(得分:1)

这应该可以为您提供所需的信息。

create table visit ( tid varchar(16), pid varchar(16), date datetime );
insert into visit values
    (112, 45, '2012-03-12'),
    (124, 12, '2013-04-03'),
    (112, 32, '2013-03-12'),
    (421, 14, '2014-01-31');

create table place ( pid varchar(16), start varchar(16), end varchar(16), starttime datetime, endtime datetime );
insert into place values
    (45, 'xyz', 'qwe', '2012-03-12 12:00:13', '2012-03-12 14:30:00'),
    (12, 'abc', 'yst', '2013-04-03 15:45:00', '2013-04-13 16:00:00'),
    (32, 'tyu', 'jkf', '2012-03-12 15:30:00', '2012-03-12 17:30:00'),
    (14, 'nyk', 'por', '2014-01-31 08:30:00', '2014-01-31 10:00:50');

select v.tid,
       (select start from place where starttime = min(p.starttime)) as start,
       (select end from place where endtime = max(p.endtime)) as end
  from visit v
  join place p using (pid)
 group by v.tid;

+------+-------+------+
| tid  | start | end  |
+------+-------+------+
| 112  | xyz   | jkf  |
| 124  | abc   | yst  |
| 421  | nyk   | por  |
+------+-------+------+

注意#1:我的repro使用MySQL,所以如果标准SQL与我所看到的不同,请随意评论/投票给另一个答案。

注意#2:您应该在place表格中使用日期时间(而不仅仅是时间),以允许通宵航班。

答案 1 :(得分:0)

我认为像这样的SQL查询会返回您想要的结果。

SELECT DISTINCT visit.tid, 
(
   SELECT TOP 1 start
   FROM place 
   WHERE pid = visit.pid
   ORDER BY starttime ASC
) as start,
(
   SELECT TOP 1 end
   FROM place
   WHERE pid = visit.pid
   ORDER BY endtime DESC
) as end
FROM visit