Как написать запрос типа «наибольшее n на группу», но с дополнительными условиями?

Вчера я задал вопрос о создании запроса типа «наибольшее n на группу» (в то время, не зная, что это называется «наибольшее n на группу»), но я спросил, как получить наименьшее значение на группу. . Структура таблицы была следующей:

type    name    value
=====================
1       item1    1
1       item2    20
2       item3    0
3       item4    5
3       item5    2
3       item6    50

Я получил несколько замечательных ответов, и самый полезный из них был следующим:

SELECT t1.type, t1.name, t1.value
FROM mytable t1
LEFT JOIN mytable t2 ON t1.type = t2.type AND t1.value > t2.value
WHERE t2.value IS NULL

Приведенный выше запрос приводит к следующему результату:

type    name    value
=====================
2       item3    0
1       item1    1
3       item5    2

Однако, задав вопрос, я понял, что не учел важное требование, которое я не могу понять, как добавить к приведенному выше запросу.Мне нужно добавить условный оператор, который вместо выбора строки с наименьшим значением для столбца на группу выбирает строку с наименьшим значением для столбца на группу, но где эта строка имеет другой столбец со значением больше чем некоторое минимальное значение.

Вот мой новый вопрос/проблема:


У меня есть следующая таблица (продукты):

+-----------------------------------------------------------+
|   id   |   type   |   name   |   popularity   |   price   |
+-----------------------------------------------------------+
|    0   |    0     |   item1  |      3.5       |   0.99    |
|    3   |    1     |   item2  |      3         |   1.99    |
|    4   |    1     |   item3  |      6         |   2.95    |
|    6   |    1     |   item4  |      9         |   2.50    |
|    9   |    1     |   item5  |      12        |   3.75    |
|    12  |    2     |   item6  |      16        |   5.25    |
|    13  |    2     |   item7  |      32        |   10.95   |
|    14  |    2     |   item8  |      48        |   7.50    |
+-----------------------------------------------------------+

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

Итак, предположим, что популярность должна быть больше 3, тогда результат должен быть:

+-----------------------------------------------------------+
|   id   |   type   |   name   |   popularity   |   price   |
+-----------------------------------------------------------+
|    0   |    0     |   item1  |      3.5       |   0.99    |
|    6   |    1     |   item4  |      9         |   2.50    |
|    12  |    2     |   item6  |      16        |   5.25    |
+-----------------------------------------------------------+

Если популярность должен быть больше 6, то результат должен быть:

+-----------------------------------------------------------+
|   id   |   type   |   name   |   popularity   |   price   |
+-----------------------------------------------------------+
|    6   |    1     |   item4  |      9         |   2.50    |
|    12  |    2     |   item6  |      16        |   5.25    |
+-----------------------------------------------------------+

Надеюсь, я выполнил оба эти условия. примеры правильно. В любом случае, я думаю, вы поняли идею.

Можно ли сделать то, что я прошу, одним запросом?

5
задан TMS 8 July 2014 в 18:31
поделиться