Подсчитать количество предыдущих транзакций на одного клиента в SQL (от ER до DW) - PullRequest
0 голосов
/ 09 апреля 2020

Мне нужно сосчитать количество предыдущих бронирований, сделанных клиентом, до текущего. Сведения о желаемом выводе приведены ниже.

HotelID RoomID BookingID PrevBookingCount  
H6  R8  G3  B1  0  
H6  R2  G5  B2  0  
H6  R7  G1  B3  0  
H10 R4  G7  B4  0  
H10 R9  G2  B5  0  
H13 R1  G11 B6  0  
H13 R8  G1  B7  1  
H13 R5  G5  B8  1  
H13 R3  G1  B9  2  

В третьем столбце указан идентификатор гостя. Это поле, которое должно учитываться при определении предыдущих бронирований. Например, см. Бронирование B3 (строка 3) с идентификатором гостя G1. У этого клиента первое бронирование B1. Предыдущие заказы должны быть нулевыми. Бронирование B7 снова осуществляется гостем G1, но теперь у этого клиента есть одно предыдущее бронирование. Аналогично для бронирования B9.

Таблица была создана с PrevBookingCount, для которого установлено значение NULL, и для предоставления результатов необходимо использовать оператор обновления или изменения таблицы.

create table bookings
(HotelID varchar(4),
RoomID varchar(4),
BookingID varchar(4),
PrevBookingCount int)

insert into bookings
values('H6','R8','G3','B1',NULL)
values('H6','R2','G5','B2',NULL)
...
values('H13','R3','G1','B9',NULL)

Мои подписчики (плохо ) попытка дает одно и то же значение (6) для каждой записи.

update bookings
set PrevBookingCount = count(distinct GuestID)

Существует ли какой-то итерационный подход или подзапрос, который может дать результаты?

1 Ответ

0 голосов
/ 09 апреля 2020

SQL таблицы представляют неупорядоченные наборы. Не существует такого понятия, как «предыдущее бронирование», если только в столбце не указана эта информация. Я предполагаю, что bookingid делает это.

Затем я рекомендую использовать row_number():

select b.*,
       row_number() over (partition by guestid order by bookingid) - 1 as PrevBookingCount
from bookings b;

. Я не вижу смысла хранить это как отдельный столбец в таблице, потому что это может быть легко вычислено.

Однако, если вы действительно хотите это сделать, то стандартный синтаксис SQL будет выглядеть следующим образом:

update bookings
    set PrevBookingCount = (select count(*)
                            from bookings b2
                            where b2.GuestID = b.GuestId and
                                  b2.BookingId < b.BookingId
                           );

Это кажется излишне дорогостоящим и излишним -дата со следующим изменением базы данных.

...