Выберите уникальный кортеж строк с определенными условиями

#sql #postgresql

#sql #postgresql

Вопрос:

Рассмотрим таблицу под названием HotelBooking , содержащую 2 столбца: email и dateOfBooking .

Как мне вернуть все уникальные кортежи (так что 2 столбца: email1 и email2 ), которые сделали хотя бы одно бронирование точно на 1 ту же дату бронирования. Это означает, что я не хочу возвращать какие-либо кортежи, которые сделали хотя бы одно бронирование в один и тот же день, но несколько раз.

Отправная точка:

 SELECT hb1.email AS email1, hb2.email AS email2, hb1.dateofbooking  FROM hotelbooking hb1 INNER JOIN hotelboeking hb2 USING (email, tijdstip)  

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

1. Пожалуйста, добавьте несколько строк примерных данных и ожидаемый результат.

2. вам необходимо предоставить примерные данные и желаемый результат

Ответ №1:

Вы можете попробовать это :

Сначала мы группируем все электронные письма на общую дату бронирования, и мы сохраняем только группы с более чем одним электронным письмом (первое предложение HAVING count(*) gt; 1 ). Затем мы вычисляем все биномы (email1, email2) в пределах одной группы (,оба предложения CROSS JOIN LATERAL ), которые мы перегруппируем по (email1, email2) и сохраняем только биномы, которые имеют более 1 общей даты бронирования (второе предложение HAVING count(*) gt; 1 ).

 WITH list AS ( SELECT dateOfBooking  , array_agg(email) AS email_array  FROM HotelBooking   GROUP BY dateOfBooking HAVING count(*) gt; 1 ) SELECT email1, email2  , count(*) AS common_dates_count  , array_agg(dateOfBooking) AS common_dates  FROM list AS l  CROSS JOIN LATERAL unnest(email_array) AS email1  CROSS JOIN LATERAL unnest(email_array) AS email2  WHERE email1 lt;gt; email2  GROUP BY email1, email2 HAVING count(*) gt; 1  

Ответ №2:

вы можете использовать этот код.

получить значение JSON

 SELECT JSON_QUERY((SELECT hb1.email AS email1, hb2.email AS email2 FOR JSON PATH,WITHOUT_ARRAY_WRAPPER)) email, hb1.dateofbooking  FROM hotelbooking hb1 INNER JOIN hotelboeking hb2 USING (email, tijdstip)