从子查询中选择最大值Oracle

问题描述:

我正在使用Oracle并试图为每个站点查找最大交易计数(和相关日期)。从子查询中选择最大值Oracle

这是我的代码,但它返回每个站的每个交易计数和日期,而不仅仅是最大值。如果我将日期部分从外部查询中提取出来,它仅返回每个站点的最大交易计数,但我需要知道它发生的日期。有谁知道如何让它工作?

谢谢!

SELECT STATION_ID, STATION_NAME, MAX(COUNTTRAN), TESTDATE 
FROM 
(
    SELECT COUNT(TRANSACTION_ID) AS COUNTTRAN, STATION_ID, 
      STATION_NAME, TO_CHAR(TRANSACTION_DATE, 'HH24') AS TESTDATE 
    FROM STATION_TRANSACTIONS 
    WHERE COUNTRY = 'GB' 
    GROUP BY STATION_ID, STATION_NAME, TO_CHAR(TRANSACTION_DATE, 'HH24') 
) 
GROUP BY STATION_ID, STATION_NAME, TESTDATE 
ORDER BY MAX(COUNTTRAN) DESC 

此图像显示了结果我目前得到VS那些我想:

enter image description here

+1

我希望你知道2015年1月1日和2016年1月1日将被视为同一天。 (当结果完成时执行'TO_CHAR'。) – jarlh

你的查询会是这样的:

  1. 子查询:获取每station_id一个记录,station_name和日期。为每个这样的组合计算交易。
  2. 主要查询:每个station_id,station_name和日期获取一条记录。 (我们已经这样做了,所以它不会改变任何内容。)
  3. 按交易计数排序记录。

这不是你想要的。你需要的是每station_id一个结果行,站的班次,所以在你的主查询,你应该通过这些,不包括日期已分组:

select 
    station_id, 
    station_name, 
    max(counttran) as maxcount, 
    max(testdate) keep (dense_rank last over order by counttran) as maxcountdate 
from 
(
    select 
    count(transaction_id) as counttran, 
    station_id, 
    station_name, 
    to_char(transaction_date, 'hh24') as testdate 
    from station_transactions 
    where country = 'GB' 
    group by station_id, station_name, to_char(transaction_date, 'hh24') 
) 
group by station_id, station_name; 

另一种将再次不组由主查询,因为实际上你已经有了所需的记录,只想删除其他记录。您可以通过在子查询中对记录进行排名来做到这一点,即给他们的行号,用#1来记录每个站点的最佳记录(这是计数最高的记录)。然后解雇所有其他人,你就完成了:

select station_id, station_name, counttran, testdate 
from 
(
    select 
    count(transaction_id) as counttran, 
    row_number() over(partition by station_id order by count(transaction_id) desc) as rn 
    station_id, 
    station_name, 
    to_char(transaction_date, 'hh24') as testdate 
    from station_transactions 
    where country = 'GB' 
    group by station_id, station_name, to_char(transaction_date, 'hh24') 
) 
where rn = 1; 
+0

很好的使用分析函数 – jclozano

+1

@jclozano:谢谢。虽然我没有考虑使用分析函数的第一个查询(没有窗口子句),但仅仅使用Oracle的KEEP子句进行聚合。但是,我添加了另一个查询,它使用分析函数ROW_NUMBER更加优雅地解决此任务:-) –

+0

我认为这是分析,因为您使用了OVER关键字:) – jclozano