2017-06-19 7 views
3

さて、これは不自然なように聞こえるかもしれませんが、私が尋ねることはちょっとキディッシュに見えるかもしれません。しかし、私はいつも他のどこよりもここに心を吹き込む方が好きです。不要な値を付けずにグループに列を含める方法

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 

したがって、テーブルは、領域内の一部の温度定格(ほんのいくつかのテストデータ)のサンプルデータからなる:

はだから、テーブルは以下の通りであるTEMP_CALCと呼ば有します。

私が望むのは、最高気温の都市とその国の名前と気温格付け自体を表示するクエリです。

私が作成したクエリは、国名と最高気温を与えたり、テーブルのすべての行を与えたりします。 次のように私はこれまで試したことはある:

これは私だけ国を与えTEMP -

**************************** 
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

ここにNative 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

または、ROW_NUMBERの代わりに 'RANK'を使用して、関係を考慮します。 –

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; 

これにより、最大tempsに基づいてテーブルから結果をフィルタリングできるようになります。

+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 
関連する問題