Ограничить строки в результирующем наборе значениями столбцов

#java #hibernate

#java #спящий режим

Вопрос:

Этот вопрос касается построения правильного Criteria в гибернации для следующего случая.

Предположим, я начинаю с такой таблицы:

 id ts metric   value carrier
1  1  distance 4     alice
2  1  count    2     alice
3  2  distance 3     alice
4  2  count    1     alice
5  1  distance 3     becky
6  1  count    2     becky
7  2  distance 4     becky   
8  2  count    1     becky
9  1  distance 10    other
10 1  count    10    other
11 2  distance 10    other
12 2  distance 10    other
  

Это набор показателей с привязкой ко времени, фиксирующий, как далеко, и общий перенос некоторых элементов. alice becky other count distance

Я бы хотел свернуть его следующим образом: сохраняются показатели с «другим» или «победителем», определяемые distance для каждого временного интервала. Таким образом, приведенная выше таблица даст следующий набор результатов:

 id ts metric   value carrier
1  1  distance 4     alice
2  1  count    2     alice
7  2  distance 4     becky   
8  2  count    1     becky
9  1  distance 10    other
10 1  count    10    other
11 2  distance 10    other
12 2  distance 10    other
  

В конечном итоге это преобразуется в это:

 ts carrier distance count
1  alice   4        2
1  other   10       10
2  becky   4        1
2  other   10       10
  

Но этот перевод я уже понимаю, как это сделать. Мне неясно, как создать критерии для сохранения метрик «top n». Что подводит нас к проблеме: хотя этот пример упрощен, будет большое количество «носителей», и меня интересуют верхние n такие носители, отбрасывая остальные. Таким образом, в приведенном выше примере n = 1 , но это, вероятно, будет больше, чем 1 в большинстве случаев.

Я знаю, что могу использовать addOrder(Order.desc("value") , но это создает проблему, other поскольку она смешивается, а расстояния и количество будут неправильно перемешаны. Я ищу что-то, что сортирует «блоки» строк, которые определяются по порядку ts , затем carrier , затем, используя metric = "distance" для порядка сортировки.

Комментарии:

1. Это похоже на то, для чего я бы использовал оконные функции , если бы работал с SQL в Postgres, но Hibernate может быть не так легко приспособлен для таких вещей.

2. @Kayaman Возможно, но я не смог найти никакой прямой поддержки для этого в режиме гибернации.

3. Это то, что я имел в виду. Расширения, специфичные для базы данных, вряд ли будут поддерживаться в режиме гибернации, поэтому я очень сомневаюсь, что criteria API сможет делать то, что вы хотите. Если вы можете придумать стандартный SQL для выполнения вышеуказанных действий, это будет совсем другой зверь.