我在Microsoft Access中有一个大型数据集,其中一列中包含邮政编码,下一列中包含无序类别,如下所示:
Postcode | Class
--------------------------
1111AA | A
1111AA | B
1111AA | A
1111AB | C
1111AB | C
1111AB | A
我想对数据进行分组,以便在左侧我有一个Postcode用于右边的Class模式。这些类是无序的(即:A不比B好,C也不比B好)。我尝试过使用查询,但它们只适用于数值数据,而我似乎只能使用这些技术来查找平均值。
所以最后我想要:
Postcode | Class
------------------------
1111AA | A
1111AB | C
谢谢!
答案 0 :(得分:0)
通过每个邮政编码的大多数频率,您需要先进行预查询,然后匹配该计数...基本上对表进行三重处理。
别名中的第三级(QPerClass)获取每个邮政编码,每个类及其各自的计数。一个邮政编码中的最大分类数为3,而另一个邮政编码中的数字5是两个单独的东西,如果其他邮政编码只有3个,您不希望总体最受欢迎的5个计数,它永远不会找到相应的匹配
因此,根据您的样本数据,这将导致
PostCode Class Count
1111AA A 2
1111AA B 1
1111AB C 2
1111AB A 1
从那以后,我们需要每个邮政编码的最大数量,但你不能抓住与之相关的课程,因为你不能用最大数量来抓住课程,而你不能为每个邮政编码限制1 ..这将导致
1111AA 2
1111AB 2
现在您有每个邮政编码的计数,将其连接到您的原始表并通过AND a应用一个组,以便外层HAVING COUNT(*)与第二步中确定的MAX()计数相匹配
select
pc.postCode,
pc.class,
MaxPostByCode.MaxCount
from
PostalCodes pc
JOIN ( select QPerClass.postCode,
max( QPerClass.perClassCount ) MaxCount
from
( select pc2.postcode,
pc2.class,
count(*) perclassCount
from
postalcodes pc2
group by
pc2.postcode,
pc2.class ) QPerClass
group by
QPerClass.postCode ) MaxByPostCode
on pc.postcode = MaxByPostCode.postCode
group by
pc.postCode,
pc.class,
MaxPostByCode.MaxCount
having
count(*) = MaxPostByCode.MaxCount
现在,如果你有一个实例,其中有多个条目具有相同的MODE(每个类的最大计数),那么你必须再次将其包装起来以获得限定HAVING子句的MIN(CLASS)通过邮政编码,例如
select
m.postcode,
min( m.class )
from
( entire query above with the HAVING clause ) m
group by
m.postcode
答案 1 :(得分:0)
这就是你想要的...
SELECT TOP 1 WITH TIES PostCode, Class
FROM @Temp
GROUP BY PostCode, Class
ORDER BY COUNT(*) DESC
答案 2 :(得分:0)
使用相关子查询获取邮政编码中最常出现的类:
select postcode, class
from mytable as m
where class =
(
select top 1 m2.class
from mytable m2
where m2.postcode = m.postcode
group by m2.class
order by count(*) desc
)
group by m.postcode, m.class;
如果出现平局,则任意选择一个班级。