Sql 按最大值分组(日期)

Sql 按最大值分组(日期),sql,oracle,group-by,greatest-n-per-group,ora-00979,Sql,Oracle,Group By,Greatest N Per Group,Ora 00979,我试图在表格中列出每列火车的最新目的地最长出发时间: 预期结果应为: Train Dest Time 1 SZ 14:00 2 HK 13:00 我试过使用 SELECT Train, Dest, MAX(Time) FROM TrainTable GROUP BY Train 到,我得到了一个ora-00979非分组表达式错误,表示我必须在分组语句中包含'Dest'。但这肯定不是我想要的 是否可以在一行SQL中执行此操

我试图在表格中列出每列火车的最新目的地最长出发时间:

预期结果应为:

Train    Dest      Time
1        SZ        14:00
2        HK        13:00
我试过使用

SELECT Train, Dest, MAX(Time)
FROM TrainTable
GROUP BY Train
到,我得到了一个ora-00979非分组表达式错误,表示我必须在分组语句中包含'Dest'。但这肯定不是我想要的


是否可以在一行SQL中执行此操作?

结果集中不能包含未分组的非聚合列。如果一列火车只有一个目的地,那么只需将目的地列添加到GROUPBY子句中,否则需要重新考虑查询

SELECT train, dest, time FROM ( 
  SELECT train, dest, time, 
    RANK() OVER (PARTITION BY train ORDER BY time DESC) dest_rank
    FROM traintable
  ) where dest_rank = 1
尝试:


只要没有重复列车,而且列车往往一次只到达一个车站

select Train, MAX(Time),
      max(Dest) keep (DENSE_RANK LAST ORDER BY Time) max_keep
from TrainTable
GROUP BY Train;

下面是一个仅使用左连接的示例,我相信它比任何分组方法都更有效:

另一个解决方案:

select * from traintable
where (train, time) in (select train, max(time) from traintable group by train);

我知道我来晚了,但是试试这个

SELECT 
    `Train`, 
    `Dest`,
    SUBSTRING_INDEX(GROUP_CONCAT(`Time` ORDER BY `Time` DESC), ",", 1) AS `Time`
FROM TrainTable
GROUP BY Train;
Src:


编辑:修复了sql语法

Thx Thilo:-事实上,您的答案也是正确的。但由于我只能接受一个答案,所以我选择了Oliver,因为我先尝试了他的答案。@Aries-Thilo的答案优于Oliver的答案,因为Thilo的答案执行的I/O会更少。分析函数允许SQL在一次过程中处理表,而Oliver的解决方案需要多次过程。同意,GROUP BY会导致不必要的性能损失。使用这种方法甚至是左连接都会更加有效,尤其是对于较大的表。上面的代码与下面使用行数的代码有什么区别?谁能给我解释一下。选择列车、目的地、时间,从列车表中选择列车、目的地、时间、按列车顺序划分的行号,按时间描述rn,其中rn=1@Ruslan,是的,我很同情MySQL开发人员。我喜欢这种方法,因为它只使用标准SQL,工作起来非常好,速度也非常快。令人大开眼界的是,有多少人一直说这种解决方案很棒,而且是最好的,但还没有人尝试过。简单地说,它不起作用。正确的查询是:从TrainTable t1左键选择t1.*在t1上连接TrainTable t2。Train=t2.Train和t1.TimeSELECT t1.* FROM TrainTable t1 LEFT JOIN TrainTable t2 ON (t1.Train = t2.Train AND t1.Time < t2.Time) WHERE t2.Time IS NULL;
select * from traintable
where (train, time) in (select train, max(time) from traintable group by train);
SELECT 
    `Train`, 
    `Dest`,
    SUBSTRING_INDEX(GROUP_CONCAT(`Time` ORDER BY `Time` DESC), ",", 1) AS `Time`
FROM TrainTable
GROUP BY Train;