2017-06-19 107 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 
相關問題