1

У меня есть таблица с некоторыми «функционально повторяющимися» записями - разные идентификаторы, но 4 столбца «пользовательских данных» (еще больше столбцов) идентичны. У меня есть запрос, который будет выбирать все записи с такими дубликатами.SQL два критерия из одной группы:

Теперь я хочу выбрать, из каждой группы дубликатов, сначала любой из них, у которых есть столбец A, не является нулевым - и я проверял данные, что на каждую группу не более 1 таких строк, и если есть нет в этой конкретной группе, то минимум столбца ID.

Как выбрать это? Я не могу точно использовать неагрегат в THEN of CASE и агрегат в ELSE. Например. это не работает:

SELECT CASE 
      WHEN d.A IS NULL THEN d.ID 
      ELSE MIN(d.ID) END, 
     d.B, 
     d.C, 
     d.E, 
     d.F 
FROM TABLE T 
JOIN (my duplicate query here) D ON T.B=D.B 
AND T.C=D.C 
AND T.E=D.E 
AND T.F=D.F 
GROUP BY T.B, 
     T.C, 
     T.E, 
     T.F 

Ошибка существо:

колонка А должен появиться в GROUP BY оговорки или использоваться в агрегатной функции.

+0

Возможно, «COALESCE (MIN (CASE, КОГДА d.A НЕ НЕВЕРНО, ТО ЧЕМ d.ID ELSE NULL END), MIN (D.ID))'? Он рассматривает D.ID только в том случае, если D.A не является нулевым; если ни один не найден, будет возвращен min (d.id). –

+0

Отлично! Опубликуйте как ответ, и я соглашусь. Благодаря! – Kev

ответ

1

Это может быть радикально проще:

SELECT DISTINCT ON (b, c, e, f) 
     b, c, e, f, id -- add more columns freely 
FROM (<duplicate query here>) sub 
ORDER BY b, c, e, f, (a IS NOT NULL), id 
  • Ваш дубликат запроса имеет все столбцы. Не нужно снова JOIN на базовый стол.

  • Используйте расширение Postgres стандартного SQL DISTINCT: DISTINCT ON:

  • Postgres имеет правильный тип булево. Вы можете прямое выражение ORDER BY boolean. Последовательность FALSE (0), TRUE (1), NULL (NULL). Если a равно NULL, это выражение равно FALSE и сортируется первым: (a IS NOT NULL). Остальное заказано id. Вуаля.

  • Выбор ID происходит автоматически. В соответствии с вашим описанием вам нужен идентификатор строки, выбранной в этом запросе. Больше нечего делать.

  • Возможно, вы можете интегрировать это в свой дублированный запрос напрямую.

Смежные вопросы