0

我在试卷中发现了一个问题,该问题由具有这些属性的表 Forest 组成

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

基本上,问题要求找到在同一公司同一地点发现的所有森林,并根据该信息创建此表

Smaller_Forest Larger_Forest CompanyName

当我打算在 SQL 方面按更小或更大对重复项进行排序时,我被卡住了。

我是否打算进行交叉连接并消除相同大小的森林或类似的东西?如果是这样,我如何将更大和更小的森林放在同一记录中(也许按公司名称值?)

为了过滤掉重复我做了这个:

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

所以这是为了给我一张按位置和公司列出所有重复森林的表格。剩下的就是将它们分类到上面提到的表格中,这是我卡住的地方。

非常感谢您对此事的任何帮助。

4

1 回答 1

0

这个问题是可疑的,因为它假设当有重复时只有两个森林。我会先做:

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

这告诉您每个森林的公司数量分布。

然后,如果每个公司/位置只有两个森林,有几种方法可以在一行中获取最小和最大的名称。当然,一个问题是这两个森林的大小可能相同——这可能会给这些方法带来麻烦。这是一个尝试:

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;

通过在子句中同时使用min()and ,当大小相同时,查询将返回两个名称。max()select

作为补充评论,我发现这样的练习没有应有的用处。有很多真实数据示例,您必须在其中处理重复项。由于没有提及诸如可能解决方案的数量以及在森林大小相同时应该做什么等问题,该练习作为一个真实世界的示例有点误导。

于 2013-06-06T13:11:46.313 回答