2014-09-25 4 views
0

У меня есть большой набор данных в Microsoft Access с почтовыми индексами в одной колонке и неупорядоченный категории в следующей следующим образом:группировать данные на основе режима в SQL

Postcode  |  Class 
-------------------------- 
1111AA  |  A 

1111AA  |  B 

1111AA  |  A 

1111AB  |  C 

1111AB  |  C 

1111AB  |  A 

Я хотел бы сгруппировать данные, такие, что с левой стороны у меня есть один почтовый индекс для режима класса справа. Классы неупорядочены (т. Е. A не лучше, чем B, а C лучше, чем B). Я попытался использовать запросы, но они действительно работают только для числовых данных, и я могу только использовать эти методы для поиска средних значений.

Таким образом, в конце концов, я хочу:

Postcode  |  Class 
------------------------ 
1111AA  |  A 

1111AB  |  C 

Спасибо!

+0

Ваше описание тихое, неопределенное. Не могли бы вы отредактировать свой пост с большей ясностью, а также макет ** Ожидаемый результат **. Итак, мы увидим, чего вы на самом деле хотите. – PaulFrancis

+0

Выполнен макет ожидаемого выхода. Очевидно, что с большим набором данных было бы трудно сделать это вручную, поэтому, если это возможно, есть ли какая-то симуляторная функция, которую я мог бы использовать? –

+0

По-прежнему неясны с описанием бит. Почему 1111AA | B не в результате? Почему 1111AB | А не в результате тоже? – PaulFrancis

ответ

0

через большинство частот в почтовом индексе, сначала вам нужно предварительно запросить запрос, а затем сопоставить этот счет ... в основном делая тройной процесс против таблицы.

Третий уровень в псевдониме (QPerClass) получает по каждому почтовому индексу, каждому классу и соответствующим подсчетам. Максимальное количество классификаций 3 в одном почтовом индексе vs count 5 в другом - это две отдельные вещи, и вы не хотите, чтобы общий наиболее популярный счет 5, если у такого другого почтового кода только 3, он никогда не найдет соответствующее совпадение.

Таким образом, согласно вашим данным выборки, это приведет к

PostCode Class Count 
1111AA  A  2 
1111AA  B  1 

1111AB  C  2 
1111AB  A  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 

Теперь, если у вас есть экземпляр, где есть несколько записей, которые имеют тот же режим (макс количество каждого класса), то вам придется обернуть его еще раз, чтобы получить MIN (CLASS), квалифицирующие предложение HAVING, сгруппированное по почтовому индексу, например

Смежные вопросы