分组依据的两列的最大值

时间:2018-08-09 15:50:00

标签: sql oracle

我有一个包含以下数据的表:

TRIP   TRIP_DATE    TRIP_TIME
A      2018-08-08   11:00
A      2018-08-09   11:00
A      2018-08-08   23:00
A      2018-08-20   11:00
A      2018-08-20   14:00

我希望select语句检索旅行次数Count,最新日期和时间。 基本上输出应该是这样的:

TRIPS   MAX(TRIP_DATE)    TRIP_TIME
5       2018-08-20        14:00

5 个答案:

答案 0 :(得分:1)

这很棘手。我想我会这样做:

select cnt, date, time
from (select t.*,
             row_number() over (partition by trip order by date desc, time desc) as seqnum
             count(*) over (partition by trip) as cnt
      from t
     ) t
where seqnum = 1;

答案 1 :(得分:0)

您可以使用row_number()函数:

select t.*
from (select *, row_number() over (partition by trip order by date desc, time desc) seq
      from table t
     ) t
where seq = 1;

答案 2 :(得分:0)

您可以使用GROUP BY使用以下内容:

SELECT TRIP, COUNT(TRIP) AS cnt, MAX(CONCAT(TRIP_DATE, ' ', TRIP_TIME)) AS maxDateTime 
FROM table_name
GROUP BY TRIP

要结合DATETIME值,可以使用以下之一:

  • 使用CONCAT_WSCONCAT_WS(' ', TRIP_DATE, TRIP_TIME)
  • 使用CONCATCONCAT(TRIP_DATE, ' ', TRIP_TIME)

您可以将上述查询用作子查询,以获取DATETIME作为单独的值:

SELECT TRIP, cnt, DATE(maxDateTime), TIME_FORMAT(TIME(maxDateTime), '%H:%i') FROM (
   SELECT TRIP, COUNT(TRIP) AS cnt, MAX(CONCAT(TRIP_DATE, ' ', TRIP_TIME)) AS maxDateTime 
   FROM table_name
   GROUP BY TRIP
)t;

注意:我建议在应用程序端拆分DATETIME值。我还将DATETIME的值存储在DATETIME而不是单独的列中。

  

演示: https://www.db-fiddle.com/f/xcMdmivjJa29rDhHxkUmuJ/2

答案 3 :(得分:0)

我会同意这一点(假设您也想要MAX Trip_Time,从您的示例中很难看出这一点):

SELECT COUNT(TRIP) AS Trips, 
MAX(TRIP_DATE) AS MAX(TRIP_DATE), 
MAX(TRIP_TIME) AS TRIP_TIME 
FROM myTable
GROUP BY TRIP

答案 4 :(得分:0)

您可以选择在这里将分析功能用作组功能。 所有人都会做的。查看最终输出,我相信使用group by的max函数更合适。 没有硬性规定,但是我个人比较喜欢在需要抑制最终结果时分组。