Упорядочивать по СУММЕ, но НЕ агрегировать результирующий набор (порядок по промежуточным итогам)

#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. Я думаю, что вашими единственными вариантами являются явное объединение (как в ответе) или неявное объединение с использованием коррелированного подзапроса.