SQL и JPQL-запрос - поиск по всем группам записей по параметру с заданной датой - PullRequest
1 голос
/ 16 апреля 2019

У меня есть таблица, которая выглядит примерно так:

enter image description here

Я хочу построить запрос для поиска всех записей из этой таблицы с заданной датой (скажем, 5.12.2019) и с более ранними датами, но сгруппировать по materialID.

Пример : выберите все материалы с датой 6.12.2019, должны показать все материалы с этой датой (или материалы с более ранними датами), сгруппировать по идентификатору материала с самой большой датой Результат должен выглядеть как это:

enter image description here

Проблема: Я хочу сгруппировать свои результаты по MaterialID с самой большой датой. Поэтому в этом примере я не хочу показывать материалы с тем же идентификатором с более ранними датами.

Для того же примера:

enter image description here

Вопрос: Как построить такой запрос, используя SQL, а также JPQL? Потому что я хотел бы использовать этот запрос в Hibernate, поэтому мне нужен также запрос JPQL.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 17 апреля 2019

Это особый случай запроса "top N на категорию" . Вы хотите показать максимальную дату для идентификатора материала. В SQL (также будет работать в JPQL):

SELECT SUM(Amount), SUM(Price), MaterialId, MAX(Date)
FROM t
GROUP BY MaterialId

Обратите внимание, что с помощью этого метода вы также не можете отобразить идентификатор или MAX (идентификатор), поскольку идентификаторы и даты не обязательно монотонно увеличиваются. Если вы по-прежнему хотите, чтобы идентификатор отображался, как в вашем примере, напишите этот SQL-запрос (я не думаю, что это можно сделать в JPQL):

SELECT MAX(ID), SUM(Amount), SUM(Price), MaterialId, MAX(Date)
FROM (
  SELECT last_value(ID) OVER (
    PARTITION BY MaterialId 
    ORDER BY Date, ID 
    RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
  ) AS ID,
  Amount,
  Price,
  MaterialId,
  SELECT last_value(Date) OVER (
    PARTITION BY MaterialId 
    ORDER BY Date, ID 
    RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
  ) AS Date
  FROM t
) t
GROUP BY MaterialId
...