#sql #group-by #sql-order-by #h2
#sql #группировать по #sql-order-by #h2
Вопрос:
У меня есть следующая таблица
-------- ---------- --------
| STORE | PRODUCT | AMOUNT |
-------- ---------- --------
| store1 | product1 | 100 |
| store1 | product2 | 90 |
| store2 | product2 | 95 |
| store2 | product1 | 90 |
| store3 | product1 | 120 |
-------- ---------- --------
Дело в том, что я хочу упорядочить эту таблицу по сумме количества каждого хранилища. В этом примере store1 имеет 190, store2 имеет 185 и store3 120. Итак, порядок предоставлен в этом примере, и я также хочу заказать по количеству каждого продукта, но не хочу выводить это за рамки «магазина» и не хочу группировать, потому что мне нужно показать все строки…
Как я могу добиться такого упорядочения в базе данных H2? Я могу оценить другие базы данных, но H2 — моя главная проблема.
Кстати, производительность здесь большая проблема…
Ответ №1:
В большинстве баз данных вы бы использовали оконную функцию. H2 их не поддерживает. Итак, вам нужно выполнить явное соединение:
select t.*
from table t join
(select store, sum(amount) as totalamount
from table t
group by store
) ts
on t.store = ts.store
order by ts.totalamount desc, ts.store;
Обратите внимание , что store
находится в order by
. Это относится к случаю, когда два балла имеют одинаковую сумму. Все строки для каждого хранилища по-прежнему будут вместе.
Комментарии:
1. это лучший способ справиться с этим? Я хотел избежать объединений, потому что производительность — большая проблема
2. Я думаю, что вашими единственными вариантами являются явное объединение (как в ответе) или неявное объединение с использованием коррелированного подзапроса.