Кластеризация дат по периодам - PullRequest
1 голос
/ 06 февраля 2012

Проблема
У меня есть список ключей и другой список дат для каждого из этих ключей.В основном это Multimap из ключей к датам (на Java, Multimap<Key, Date>).Я использую эти Ключи и Даты для запроса таблицы следующим образом:

select * from Table where key = :key and date = :date

Это ужасно, так как генерируется Σ(|Date(Key)|) запросов.Чтобы улучшить это, я могу взглянуть на запросы к периодам в форме:

select * from Table where key in (:keys) and date >= :startDate and date <= :endDate

Так как требуется только один запрос, но все еще существует проблема производительности в том, что эти даты могут отличаться на очень большие периоды (года).В качестве примера возьмем базовый случай, когда есть два ключа, первый из которых имеет назначенную дату «2010-01-01», а второй - «2012-01-01».В этом случае этот запрос будет возвращать все значения за этот период, хотя мне нужны только две записи.

Подход к решению
В идеале я хотел бы создать оптимальное количество запросовгде оптимальной является функция от количества запросов и количества возвращаемых данных.Я хотел бы как можно меньше запросов, но таким образом, чтобы они возвращали наименьшее количество ненужных данных.Другими словами, простая фитнес-функция может быть w|Queries| x |Data|, где w - некоторый вес.

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

Опции
Это похоже на проблему кластеризации, но я не очень разбираюсь в кластеризации, и поэтому я не совсем уверен, с чего начать.Я предполагаю, что мне, вероятно, придется разбить мультикарту на отдельных лиц в форме (Key, Date), и оттуда искать алгоритм, который идентифицирует количество самих кластеров.

Существует ли какой-либо алгоритм или подход кластеризации, которыйхорошо подходит для моей проблемы, или, возможно, есть решение, отличное от кластеризации?

1 Ответ

0 голосов
/ 06 февраля 2012

Попробуйте использовать IN:

select * from Table where key = :key and date IN (date1, date2, date3, etc.)

С его помощью вы можете выбрать нужные даты одновременно.

...