H2 DB - Как отключить полную группу по - PullRequest
0 голосов
/ 14 октября 2019

В mysql есть флаг, который включает / отключает полную группу с помощью (ONLY_FULL_GROUP_BY), но я ищу такой же флаг или параметр строки подключения, чтобы отключить полную группу с помощью базы данных H2.

Вот мои примеры данных.

+----+---------------+-----------------+
| ID | SYNC_ID       | LIFECYCLE_EVENT |
+----+---------------+-----------------+
| 3  | 41            | 2               |
+----+---------------+-----------------+
| 2  | 41            | 1               |
+----+---------------+-----------------+
| 4  | 69            | 1               |
+----+---------------+-----------------+
| 5  | 69            | 3               |
+----+---------------+-----------------+

Вот мой желаемый вывод:

+----+---------------+-----------------+
| ID | SYNC_ID       | LIFECYCLE_EVENT |
+----+---------------+-----------------+
| 3  | 41            | 2               |
+----+---------------+-----------------+
| 5  | 69            | 3               |
+----+---------------+-----------------+

И вот мой запрос, который я пытаюсь использовать для желаемого вывода

select   id, sync_id, max(lifecycle_event)
from asset
where asset_type = 1
GROUP BY sync_id;

Но этодает мне ErrorCode: 90016, что означает, что все неагрегированные столбцы должны быть выбраны в группе по. Если я это сделаю, то получу неправильные данные.

Итак, очевидно, я не хочу группировать по id и sync_id. Пожалуйста, подскажите, как мне этого добиться в базе данных H2.

Ответы [ 3 ]

2 голосов
/ 14 октября 2019

Нет такой вещи почти в любой другой базе данных - потому что group by не нарушается в этих базах данных. Вы можете сформулировать запрос так:

select a.*
from asset a
where asset_type = 1 and
      lifecycle_event = (select max(lifecycle_event) from asset a2 where a2.sync_id = a.sync_id);
1 голос
/ 14 октября 2019

Не вижу смысла пытаться эмулировать неработающую реализацию MySQL group by.

Вы можете переписать ваш запрос на

select a1.id, a1.sync_id, a2.max_even
from asset a1
  join (
    select sync_id,  max(lifecycle_event) as max_event
    from asset 
    group by sync_id
  ) a2 on a2.sync_id = a1.sync_id
      and a2.max_event = a1.lifecycle_event;
1 голос
/ 14 октября 2019

Вы можете попробовать ниже -

select max(id),sync_id, max(lifecycle_event)
from asset
where asset_type = 1
GROUP BY sync_id
...