2017-08-26 1 views
1

目的は、最短の名前で都市を選択することです。単純なSQLコマンドのエラーとそれを解決する方法

私はSQLに非常に新しいですし、私は次のクエリのための問題の原因を理解することはできません。

SELECT city, min(len) 
    FROM (SELECT city, length(city) AS len 
      FROM station 
      GROUP BY city 
     ) 
; 

それはエラーがスローされます。

ERROR at line 1:

ORA-00937: not a single-group group function

私は問題をGoogleで検索し、それが言いますminなどの集計関数を使用する場合はGROUP BYが必要です。

SELECT city, min(len) 
    FROM (select city, length(city) AS len 
      FROM station 
      GROUP BY city 
     ) 
    GROUP BY city 
; 

しかし、それは私が(私は疑うように)すべての都市分間与えます:だから私は、次のことを試してみました。

SELECT city, min(len) 
    FROM (select city, length(city) AS len 
      FROM station 
      GROUP BY city 
     ) 
    GROUP BY len 
; 

を、それは私に別のエラーを与える:

は、その後、私はgroup by lenしようとした

ERROR at line 1:

ORA-00979: not a GROUP BY expression

私は列全体に分を選ぶだろうか...なぜ を理解していませんか?

enter image description here

+0

これは、あなたがまだOracleエラー・メッセージが表示されますMySQLおよびMicrosoft SQL Serverの両方で質問をタグ付けしている –

+2

MySQLのではなくSQL Serverのではありません。あなたはあなたが使っているDBMSを知っていますか? –

+0

@ダングズマン・ハハ...ノー!私はちょうどHackerRankのこのSQLトラックを選んだ。私はそれが使用するDBMSを知らなかった。しかし、 – YohanRoth

答えて

1

同じ最小の長さを持つ複数の都市があるかもしれません。あなたが最初にその最小の長さがあり、その後、あなたはその長さに基づいてフィルタリングすることができるものを見つけた場合:

SELECT city 
    FROM station 
    WHERE length(city) = (SELECT MIN(length(city)) FROM station) 
; 
1

特にOracleのためのいくつかのより多くのアプローチ:

最短名に対して複数の都市の絆であれば、それらをリストアップ

select city, length(city) 
from station 
order by length(city), city 
fetch first row only; 
:タイブレーカーとしてアルファベット順を使用して、最も短い名前の

select city, length(city) 
from station 
order by length(city) 
fetch first row with ties; 

レポート唯一の都市:すべては(Oracleの12.1が必要です) Oracleの以前のバージョンについては

select city, name_length 
from (select city, length(city) as name_length 
       , dense_rank() over (order by length(city)) as length_rank 
     from station) 
where length_rank = 1 
order by city; 
関連する問題