基于sql中的模式分组数据

时间:2014-09-25 13:32:38

标签: sql ms-access

我在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

谢谢!

3 个答案:

答案 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;

如果出现平局,则任意选择一个班级。