如何在没有不需要的值的情况下在组中包含列

时间:2017-06-19 07:14:02

标签: sql oracle greatest-n-per-group

好吧,这可能听起来很蹩脚,但我要问的可能看起来有些偏执。但是我仍然总是喜欢把我的心脏洒在这里,而不是其他任何地方。

所以我有一个名为 TEMP_CALC 的表格,如下所示:

  COUNTRY   CITY         TEMP
=============================
   US      Arizona       51.7
   US      California    56.7
   US      Bullhead City 51.1
   India   Jaisalmer     42.4
   Libya   Aziziya       57.8
   Iran    Lut Desert    70.7
   India   Banda         42.4

因此,该表包含区域内某些温度等级的样本数据(仅一些测试数据)。

我想要的是一个查询,它会显示最高温度的城市及其国家名称和温度等级本身。

我做的查询要么给我国家名称和最高温度,要么给我表中的所有行。 到目前为止我尝试的内容如下:

这只给我 COUNTRY TEMP -

****************************
select country,max(temp) 
from temp_calc
group by country

当我尝试将这些城市名称包含在这些温度中时,它会给我表中的所有行 -

*************************
select country,city,max(temp) 
from temp_calc
group by country,city

我想要最高温度的城市以及国家名称和温度等级本身。

3 个答案:

答案 0 :(得分:3)

如果我理解正确,你想要每个国家的温度最高的城市。这通常使用窗口函数完成:

select country,city,temp
from (
  select country,city,temp, 
         row_number() over (partition by country order by temp desc) as rn
  from temp_calc
) t 
where rn = 1
order by country, city;

答案 1 :(得分:1)

您第一次尝试就有解决方案:

select country,max(temp) 
from temp_calc
group by country

您只需将相应的城市添加到结果集即可。你可以这样做:

 with max_temp as (select country, max(temp) m_temp 
    from temp_calc
    group by country)
 select country, city, temp 
 from temp_calc where 
 temp=max_temp.m_temp and 
 country=max_temp.country;

这应该允许您根据最大临时值过滤表中的结果。

答案 2 :(得分:1)

select * from (
select *,  ROW_NUMBER() over (partition by country order by country,temp desc) as sortid, 
 from temp_calc  ) t 
 where sortid =1