0

これらの属性を持つ表 Forest で構成される問題を試験問題で見つけました

Name - type : C(10)
Size - type : I
Location - type : C(10)
Company - type : C(10)

基本的に、この質問では、同じ場所にある同じ会社のすべての森林を検索し、その情報を基にこのテーブルを作成するよう求めています。

Smaller_Forest Larger_Forest 会社名

SQL の観点から、重複を小さくまたは大きく並べ替えようとしているときに行き詰まります。

CROSS JOIN を実行して、同じサイズのフォレストなどを削除するつもりですか? もしそうなら、同じレコードに大小のフォレストを配置するにはどうすればよいですか (おそらく会社名の値でしょうか?)

重複を除外するために、次のようにしました。

Select * INTO ForestSameLocationCompany 
GROUP BY Location, Company 
HAVING (count(distinct Location)>1) AND (count(distinct Company)>1) 

したがって、これは、場所と会社ごとにすべての重複するフォレストを含むテーブルを提供することを意図しています。残っているのは、それらを上記の表に並べ替えることだけです。

この問題に関するヘルプは大歓迎です。

4

1 に答える 1

0

重複がある場合、フォレストは 2 つしかないと仮定しているため、この質問は疑わしいものです。私は次のことから始めます:

select cnt, count(*)
from (select company, location, count(*) as cnt
      from Forest
      group by company, location
     ) cl
group by cnt
order by cnt;

これにより、フォレストごとの企業数の分布がわかります。

次に、会社/場所ごとに 2 つのフォレストしかない場合、1 つの行で最小と最大の名前を取得する方法がいくつかあります。もちろん、問題の 1 つは、2 つのフォレストが同じサイズになる可能性があることです。ここに試みがあります:

select company, location,
       min(case when size = minsize then name end) as minForest,
       max(case when size = maxsize then name end) as maxForest
from Forest f join
     (select company, location, min(size) as minsize, max(size) as maxsize
      from forest
      group by company, location
      having count(*) > 1
     ) cl
     on f.company = cl.company and f.location = cl.location
group by company, location;

句でboth min()andmax()を使用するとselect、サイズが同じ場合、クエリは両方の名前を返します。

追加のコメントとして、私はそのような演習は本来あるべきほど役に立たないと思います. 重複を処理しなければならない実世界のデータの例はたくさんあります。考えられる解の数や、フォレストが同じサイズの場合に何をすべきかなどの問題に言及していないため、この演習は実際の例として少し誤解を招きます。

于 2013-06-06T13:11:46.313 に答える