很抱歉,如果我的标题有点混乱,我不确定如何说出来。
我有一张代表公交车时刻表的表。每次旅行都有一个入口,以及到达和离开时间以及停靠顺序。例如:
Trip_ID Arrival Departure Stop_ID Stop_Seq
Trip1 06:00:00 06:00:30 465 1
Trip1 06:03:45 06:04:15 474 2
...
Trip1 06:53:15 06:53:45 169 27
Trip1 06:56:30 06:57:00 311 28
Trip2 07:02:00 07:02:30 534 1
Trip2 07:03:45 07:04:15 700 2
...
Trip2 07:41:50 07:42:20 164 35
Trip2 07:45:30 07:46:00 311 36
我的目标是编写一个查询,该查询将返回每个唯一Trip的两个结果,具有最低Stop_Seq的记录和具有最高Stop_Seq(每个行程)的记录。 例如:
Trip_ID Arrival Departure Stop_ID Stop_Seq
Trip1 06:00:00 06:00:30 465 1
Trip1 06:56:30 06:57:00 311 28
Trip2 07:02:00 07:02:30 534 1
Trip2 07:45:30 07:46:00 311 36
我试图做以下事情,但我不太了解Group By逻辑。
SELECT trip_id,arrival,departure,stop_id,MIN(stop_seq),MAX(stop_seq)
FROM stop_times
GROUP BY trip_id;
不幸的是,我感到不安的是,我并没有按时间分组并停止,但这不会起作用,我不想要所有的时间,只有第一个和最后一个。
非常感谢您提供的任何帮助! :)
答案 0 :(得分:1)
如果Stop_Seq是唯一的,那么您可以使用派生表。派生表从stop_times表中获取Min和Max Stop_Seq。接收查询可以加入以重新获取详细信息:
SELECT dT.Trip_ID
,ST.Arrival
,ST.Departure
,ST.Stop_ID
,dT.Stop_Seq
FROM (
SELECT Trip_ID, MIN(Stop_Seq) AS Stop_Seq FROM stop_times GROUP BY Trip_ID
UNION ALL
SELECT Trip_ID, MAX(Stop_Seq) FROM stop_times GROUP BY Trip_ID
) AS dT
INNER JOIN stop_times ST
ON dT.Trip_ID = ST.Trip_ID
AND dT.Stop_Seq = ST.Stop_Seq
ORDER BY Trip_ID
提供输出:
Trip_ID Arrival Departure Stop_ID Stop_Seq
Trip1 06:00:00 06:00:30 465 1
Trip1 06:56:30 06:57:00 311 28
Trip2 07:02:00 07:02:30 534 1
Trip2 07:45:30 07:46:00 311 36
以下是完整的代码:http://sqlfiddle.com/#!6/b9efc/1/0
它没有按预期工作的原因是因为GROUP BY删除了重复项,但是Arrival,Departure和Stop_ID列中的值正在发生变化。这些不断变化的价值使GROUP BY失败。
答案 1 :(得分:0)
以下查询将返回每个Trip
记录,其最低Stop_Seq
和最高Stop_Seq
。
SELECT *
FROM stop_times a
WHERE a.Stop_Seq=(
SELECT MAX(b.Stop_Seq)
FROM stop_times b
WHERE a.Trip_ID=b.Trip_ID
)
or
a.Stop_Seq=(
SELECT MIN(b.Stop_Seq)
FROM stop_times b
WHERE a.Trip_ID=b.Trip_ID
)