#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)