2014-02-21 52 views
0
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 

我對這件事感到難以置信。我知道這個零件和零件,但我無法把它們放在一起。我需要如下結果sql查詢根據開始時間和結束時間查找不同的條目

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

如上所示,我需要在同一天派生出唯一的票證實例。但我需要根據時間開始和結束的地方。根據startime和endtime開始時應該有最早的實例結束最新。

回答

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:我的攝製使用MySQL,所以隨意評論/投票了另一個答案,如果標準的SQL從我所看到的變化。

注意#2:您應該在place表中使用datetime(而不僅僅是時間)來允許隔夜飛行。

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 
相關問題