我在考试卷中发现了一个问题,该论文由具有这些属性的表林组成
Name - type : C(10)
Size - type : I
Location - type : C(10)
Company - type : C(10)
基本上,问题是要求找到同一公司在同一地点找到的所有森林,并根据该信息创建此表
Smaller_Forest Larger_Forest CompanyName
当我打算在SQL方面对重复项进行较小或较大的排序时,我陷入困境。
我打算做一个CROSS JOIN并消除大小相同或类似的森林吗?如果是这样,我如何将较大和较小的森林放在同一记录中(可能是公司名称值?)
为了过滤掉重复项,我这样做了:
Select * INTO ForestSameLocationCompany
GROUP BY Location, Company
HAVING (count(distinct Location)>1) AND (count(distinct Company)>1)
所以这是为了给我一张表,按位置和公司列出所有重复的森林。剩下的就是把它们分成上面提到的表格,这就是我被困住的地方。
非常感谢您对此事的任何帮助。
答案 0 :(得分: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()
子句中同时使用max()
和select
,当大小相同时,查询将返回两个名称。
作为一个额外的评论,我发现这样的练习没那么有用了。有大量的实际数据示例,您必须处理重复项。通过不提及诸如可能的解决方案的数量以及当森林大小相同时该做什么等问题,这个练习作为一个现实世界的例子有点误导。