2017-06-19 109 views
3

好的,这可能听起来很蹩脚,但我要问的可能看起来有点儿笨手笨脚。但我仍然宁愿让我的心在这里比其他地方更难过。如何在一个组中包含一列而没有不需要的值

所以我有一个表称为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 

因此,该表由用于在地区的一些温度额定值(只是一些测试数据)样品的数据。

我想要的是一个查询,将显示与他们的国家名称和温度等级本身最高温度的城市。

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

这给了我只有COUNTRYTEMP -

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

,当我尝试以包括附加到这些温度的城市名称,然后它给了我表中的所有行 -

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

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

+0

也许添加LEN(国家),看他们是否真正相同。 –

+0

@Anthony Horne它会抛出一个错误,**无效标识符“LEN”** – hashir

+0

对不起=本机MSSQL在这里 - 使用LENGTH(string1) –

回答

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; 
+0

或者使用'RANK'而不是'ROW_NUMBER'来考虑关系。 –

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; 

这应该允许你根据最大临时表过滤结果。

+0

您错过了max_temp的连接,而IN条款反而会感觉更自然。 –

+0

我开始使用in子句,但我想确保如果同一温度出现在多个国家/地区,我们可以通过两者进行过滤,并且看起来像是一个简单的解决方案。 – Assafs

+1

显然你从来没有在多个列上使用过'IN'子句。这只是'在哪里(国家,温度)在(选择国家,最大(温度)...)' –

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