2017-05-23 22 views
-2

を比較するとSp_name、Sp_woodtype、Sp_maxht(種の最大高さ)を含む表と呼ばれる種が存在すると、私はこの質問頼ま:同じwoodtype(sp_woodtype)と、それぞれの種については基本的なSQLは

彼らの最大の高さを比較します。出力には、種の木型、より大きい高さの種名、およびより小さい高さの種名を含める必要があります。

これはどのように行う必要がありますか?

編集1: 私が試してみました:

SELECT sp_woodtype, sp_name a AS Larger, sp_name b AS Smaller 
FROM Species 
WHERE a.sp_woodtype = b.sp_woodtpye AND a.sp_maxht>b.sp_maxht; 
+2

SOはあなたの宿題をする人のサイトではありません。何を試しましたか? –

+0

SELECT sp_woodtypeは、Bのように大きな、sp_nameをsp_name小型の種 FROM WHERE a.sp_woodtype = b.sp_woodtpyeとa.sp_maxht> b.sp_maxht。 – betamech

+1

また、https://stackoverflow.com/questions/44142731/granddaughter-of-a-tree-sql-query - テーブルの名前と行は、その質問と非常によく似ています。 –

答えて

0

をあなたは、特定のRDBMSタグで質問をタグ付けませんでしたが、ほぼすべての近代的なRDBMSは(が顕著な例外である)ウィンドウ関数をサポートする必要があります。 rank()がここにトリックを行う必要があり、あなたのRDBMSがサポートしていると仮定:

SELECT sp_woodtype, sp_name, sp_maxht 
FROM (SELECT sp_woodtype, sp_name, sp_maxht, 
       RANK() OVER (PARTITION BY sp_woodtype 
          ORDER BY  sp_maxht ASC) AS ra, 
       RANK() OVER (PARTITION BY sp_woodtype 
          ORDER BY  sp_maxht DESC) AS rd 
     FROM species) t 
WHERE 1 IN (ra, rd) 
+0

私は悪い、それはMySQLにする必要があることを忘れていた。 – betamech

0

まずsp_woodtypeあたりの最小と最大のsp_maxhtを見つけます。これらに基づいて行を選択します:

select s.* 
from 
(
    select 
    sp_woodtype, 
    min(sp_maxht) as min_sp_maxht, 
    max(sp_maxht) as max_sp_maxht 
    from species 
    group by sp_woodtype 
) agg 
join species s on s.sp_woodtype = agg.sp_woodtype 
       and s.sp_maxht in (agg.min_sp_maxht, agg.max_sp_maxht) 
order by s.sp_woodtype, s.sp_maxht;