Есть несколько решений, которые я обычно использую для этих задач. Они не элегантны, то есть не являются поиском по двум критериям, но они выполняют свою работу.
Исходя из структуры данных, у вас есть следующие варианты:
Сортировка таблицы поиска по размеру компании, с размером в порядке убывания. После этого это простое представление, поскольку ваши крупные компании сегрегированы из маленьких.
Создайте новый ключ, состоящий из размера компании, т.е. CONCAT (компания, размер), и выполните vlookup на основе этого ключа.
Я, вероятно, использовал бы измененный* версия кластеризации k-средств с помощью последователя Декарта (например, WGS-84 ECF) координаты для точек. Это легко реализовать и сходится быстро и адаптирует к Вашим данным на независимо от того, что это похоже. Плюс, можно выбрать k для удовлетворения требованиям пропускной способности, и каждый кластер будет иметь то же число связанных очков (модификация k).
Я сделал бы таблицу кластерных центроидов и добавил бы поле к исходной таблице данных для указания на то, какой кластер она принадлежала также. Вы, очевидно, хотели бы обновить кластеризацию периодически, если Ваши данные являются вообще динамичными. Я не знаю, могли ли Вы сделать это с хранимой процедурой и триггером, но возможно.
*"Модификация" должна была бы скорректировать длину вычисленных центроидных векторов, таким образом, они будут на поверхности земли. Иначе Вы закончили бы с набором точек с отрицательной высотой (когда преобразовано назад к LLH).
Я сделал подобную вещь для географического приложения, где я хотел удостовериться, что я мог кэшировать наборы точки легко. Мой код геохеширования похож на это:
def compute_chunk(latitude, longitude)
(floor_lon(longitude) * 0x1000) | floor_lat(latitude)
end
def floor_lon(longitude)
((longitude + 180) * 10).to_i
end
def floor_lat(latitude)
((latitude + 90) * 10).to_i
end
Все стало действительно легким оттуда. У меня был некоторый код для захвата всех блоков от данной точки до данного радиуса, который переведет в единственную кэш-память, мультидобираются (и некоторый код для заделывания этого, когда это отсутствовало).
Если Вы кластеризируетесь на географическом положении, и я не могу вообразить это являющийся ничем больше :-), Вы могли сохранить "кластерный идентификатор" в базе данных наряду с координатами lat/long.
Под чем я подразумеваю, который должен разделить мировую карту на (например), 100x100, матрица (10 000 кластеров) и каждая координата присвоена одному из тех кластеров.
Затем можно обнаружить очень близкие координаты путем выбора координат в том же квадрате и умеренно закрыть путем выбора тех, которые в смежных квадратах.
Размер Ваших квадратов (и поэтому количество их) будет решен тем, как точный Вам нужна кластеризация, чтобы быть. Очевидно, если Вы только имеете 2x2 матрица, Вы могли бы получить некоторую кластеризацию координат, которые являются длинным путем независимо.
Эй будет всегда иметь преимущество случаи, такие как две точки близко друг к другу, но в различных кластерах (одно самое северное в его кластере, другое самое южное в его), но Вы могли скорректировать размер кластера ИЛИ выполнить последующую обработку результаты на стороне клиента.
Для movielandmarks.com я использовал кластеризирующийся код от Mike Purvis, одного из авторов Начала Приложений Google Maps с PHP и Ajax. Это создает деревья кластеров/точек для различных уровней масштабирования с помощью PHP и MySQL, храня его в базе данных так, чтобы отзыв был очень быстр. Часть его может быть полезна для Вас даже при использовании другой базы данных.
Я полагаю, что можно использовать пространственные типы данных MSSQL. Если они подобны другим пространственным типам данных, я знаю, они сохранят Ваши точки в дереве прямоугольников, и затем можно перейти к прямоугольникам более низкого разрешения для получения неявных кластеров.
Почему Не тестируя несколько подходов?
Сделайте некоторые тесты, то есть. Никакой конкретной кластеризации не работает лучше, чем кто-либо другой.