2016-04-01 5 views
0

Я знаю, что название немного грязное, но я покажу проблему черного цвета в белом прямо сейчас.Получите строку каждого столбца A с наибольшим значением для другого столбца B

У меня есть таблица, как это:

CREATE TABLE items (
    item_id int primary key, 
    item_type int, 
    item_value int 
); 

Фактическая таблица немного отличается, но это упрощенная версия для понимания.

Теперь, что я хочу получить в запросе SELECT, это те, у которых наибольшее значение item_value для каждого элемента item_type.

Я пытался что-то вроде:

SELECT item_id, 
     item_type, 
     item_value 
FROM items 
GROUP BY item_type 
ORDER BY item_value DESC; 

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

Большое спасибо!

+0

Примеры данных и желаемые результаты уточнят, что вы подразумеваете под «наивысшим значением для каждого разного элемента item_type». –

+0

Вопросы производительности должны включать в себя «EXPLAIN ANALYZE» и некоторую информацию о размере таблицы, индексе, текущем времени, времени ожидания и т. Д. «Slow» - относительный термин, и нам нужна реальная ценность для сравнения. –

+0

Ну, данные могут отличаться. Медленное относительное, действительно, я имею в виду, что мой запрос, вероятно, является одним из самых медленных способов сделать это, если не самый медленный. наивысшее значение должно быть отредактировано лучше как «наибольшее значение item_value». Я собираюсь изменить это. –

ответ

1

Запрос, предложенный CL, кажется, занимает такое же количество времени (измеряется с .time on), чем у меня, хотя для меня его запрос выглядит более ясным, чем мой.

индексирование только item_type, кажется, не делают разницы для любого из двух запросов, то, что, наконец, работали, чтобы создать индекс с тремя столбцами, как:

CREATE INDEX idx_items_tvi ON items(item_type, item_value, item_id) 

После этого, скорость улучшилась ЛОТ (от трех секунд до полутора секунд второго прихода).

+1

Это [индекс покрытия] (http://www.sqlite.org/queryplanner.html#covidx); это обычно не стоит для каждого запроса. –

+0

Спасибо за информацию. –

1

Стандарт SQL запрещает это, но в SQLite 3.7.11 или более поздней версии, вы можете выбрать строку из группы с MAX():

SELECT item_id, 
     item_type, 
     MAX(item_value) AS item_value 
FROM items 
GROUP BY item_type; 

Чтобы сделать этот запрос эффективным, необходимо индекс по item_type колонка.

+0

Спасибо. Когда я прочитал ваш ответ, я уже создал индекс с тремя столбцами в item_type заказа, item_value, item_id и скорость резко увеличилась. При использовании без индексов ваш запрос и мой, похоже, занимают аналогичное количество времени. Индексирование только item_type, похоже, не имеет значения, но создание индекса с item_type, item_value и item_id, как и я, улучшает скорость A LOT. –

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