SQLite: получение одного репрезентативного объекта для каждой группы объектов. - PullRequest
1 голос
/ 19 марта 2012

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

city        | name         | latitude      | longitude
---------------------------------------------------------
Berlin      | GasPump1     | 52.5          | 13.5
Berlin      | GasPump2     | 52.52         | 13.51
Zagreb      | INA1         | 45.8          | 16
Zagreb      | INA2         | 45.81         | 16.01
Zagreb      | INA3         | 45.82         | 15.99

как мне получить одну репрезентативную единицу для каждого города,используя один запрос SQL?То есть, как мне реализовать следующий псевдокод с использованием одного запроса:

representativeStationsArray = []
citiesArray = sqlQuery("SELECT DISTINCT city FROM gasstations")
for city in citiesArray:
    representativeStation = sqlQuery(
        "SELECT * FROM gasstations WHERE city = ? LIMIT 1;", 
        city)
    representativeStationsArray.append(representativeStation)

Я принял ответ, но подумал, что было бы интересно объяснить мои потребности для будущих читателей..

В iOS, когда пользователь уменьшает масштаб, слишком большое количество аннотаций, отображаемых в виде карты, замедляет работу приложения.Первое экспериментальное решение, которое я пробую (и которое должно подойти для страны, для которой я разрабатываю это), состоит в том, чтобы отфильтровать аннотации по городам и просто отобразить случайную аннотацию для каждого города.

Еслиэто окажется неудовлетворительным, я буду искать другое решение.

1 Ответ

2 голосов
/ 19 марта 2012

Если под «репрезентативной строкой» вы подразумеваете «любую произвольную строку, в которой совпадает город», то вы можете просто использовать GROUP BY:

SELECT * FROM gasstations
GROUP BY city

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

Из документов по http://sqlite.org/lang_select.html#resultset (выделено) :

Если оператор SELECTагрегированный запрос с предложением GROUP BY ...

Каждое выражение в наборе результатов затем оценивается один раз для каждой группы строк.Если выражение является агрегатным выражением, оно оценивается по всем строкам в группе. В противном случае он оценивается по одной произвольно выбранной строке из группы .Если в наборе результатов имеется более одного неагрегированного выражения, то все такие выражения оцениваются для одной и той же строки.

Примечание. Это работает для SQLite и MySQLи несколько других баз данных.Но многие (большинство?) Баз данных не позволяют выбирать неагрегированные поля в сгруппированном запросе.Так что просто помните об этом, если вы когда-нибудь переключите базы данных или развернете другую производственную базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...