SQL Query返回其他列中每个唯一条目的最高和最低

时间:2017-11-25 03:03:12

标签: sql ms-access group-by

很抱歉,如果我的标题有点混乱,我不确定如何说出来。

我有一张代表公交车时刻表的表。每次旅行都有一个入口,以及到达和离开时间以及停靠顺序。例如:

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;

不幸的是,我感到不安的是,我并没有按时间分组并停止,但这不会起作用,我不想要所有的时间,只有第一个和最后一个。

非常感谢您提供的任何帮助! :)

2 个答案:

答案 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
)