从子查询中选择最大值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那些我想:
答
你的查询会是这样的:
- 子查询:获取每station_id一个记录,station_name和日期。为每个这样的组合计算交易。
- 主要查询:每个station_id,station_name和日期获取一条记录。 (我们已经这样做了,所以它不会改变任何内容。)
- 按交易计数排序记录。
这不是你想要的。你需要的是每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;
我希望你知道2015年1月1日和2016年1月1日将被视为同一天。 (当结果完成时执行'TO_CHAR'。) – jarlh