Как получить строки с наименьшим значением в списке значений - PullRequest
0 голосов
/ 17 октября 2018

У меня есть такой набор данных:

id       item         value
1         B             6
2         B             1
3         A             1
4         C             3
5         D             6
6         D             9

Мне нужно выбрать элементы с определенными значениями, только один раз с наименьшим значением, отсортированными по элементам.Поэтому, если мне нужны только элементы со значениями 1,6 или 3, я бы хотел получить в качестве ответа:

id       item         value
    3         A             1
    2         B             1
    4         C             3
    5         D             6

Я попытался использовать group by с упорядочением по значению, но похоже на группузанимает первую подходящую строку:

SELECT * FROM tbl1 WHERE value IN (1,3,6) GROUP BY item ORDER BY item, value

вместо получения строки -

 2         B          1

Я получаю строку -

 1         B          6

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

использовать связанный подзапрос

select t.* from your_table t where t.value =
( select min(value) from your_table t1 where t1.item=t.item
  and t1.value in (1,3,6)
) and t.value in (1,3,6)
0 голосов
/ 17 октября 2018

это будет работать: вход:

  select max(id),item,min(value) from tbl1 where value in(1,3,6) group by 
  item ;

выход:

max(id) item    min(value)
3   A   1
2   B   1
4   C   3
5   D   6
0 голосов
/ 17 октября 2018

Не используйте group by для фильтрации данных.Вот для чего where.В этом случае используйте коррелированный подзапрос:

SELECT t1.*
FROM tbl1 t1
WHERE t1.value IN (1, 3, 6) AND
      t1.value = (SELECT MIN(tt1.value) FROM tbl1 tt1 WHERE tt1.item = t1.item AND tt1.value IN (1, 3, 6));

При разумных показателях приведенное выше должно быть достаточно быстрым.Обратите внимание, что фильтрация на value во внешнем запросе не требуется.

Для производительности я бы сформулировал это следующим образом:

SELECT t1.*
FROM tbl1 t1
WHERE t1.id = (SELECT tt1.id
               FROM tbl1 tt1
               WHERE tt1.item = t1.item AND
                     tt1.value IN (1, 3, 6)
               ORDER BY tt1.value 
               LIMIT 1
              );

В этом запросе предполагается, что tbl1(id) является основнымключ (кажется разумным предположением).Тогда вы хотите индекс на tbl1(tt1, item, value, id).

...