Mam następujący problem, chcę z bazy danych wyciągnąć następujące dane struktura danych
ID_KLIENTA, DATA_TRANSAKCJI (DATA + GODZINA), ZAKUP
11, 15/02/01 15:34, A
11, 15/02/01 15:36, B
11, 15/02/01 15:37, C
16, 15/02/01 12:34, C
16, 15/02/01 12:51, B
Chciałbym wyciągnąć zdarzenie poprzedzające zakup B dla poszczególnych id klientów i zupełnie nie wiem jak się za to zabrać.
0
0
SELECT id_klienta
FROM baza
WHERE zakup
= 'B';
lub
SELECT * FROM baza
WHERE id_klienta
IN (11,16);
Bo nie jestem pewny czy dobrze zrozumiałem.
0
Nie zupełnie nie o to mi chodzi. Może wytłumaczę dokładniej o jaki wynik mi chodzi. Baza ta jest olbrzymia, a ja chcę wyciągnąć zakup, który poprzedzał zakup danego produktu np. B, czyli dla klienta A powinienem otrzymać rekord 11, 15/02/01 15:34, A dla B 16, 15/02/01 12:34, C. Przez to zapytanie chcę dowiedzieć się co klienci kupują zanim kupią B. Mam nadzieję, że teraz jest to bardziej zrozumiałe.
0
SELECT Z.*
FROM Zakupy AS Z
JOIN Zakupy AS Z2
ON Z.ID_KLIENTA = Z2.ID_KLIENTA AND Z2.ZAKUP = 'B' AND Z.DATA_TRANSAKCJI < Z2.DATA_TRANSAKCJI
WHERE Z.ZAKUP <> 'B'
AND NOT EXISTS (
SELECT 1
FROM Zakupy AS Z3
WHERE Z.ID_KLIENTA = Z3.ID_KLIENTA
AND Z3.DATA_TRANSAKCJI > Z.DATA_TRANSAKCJI
AND Z3.DATA_TRANSAKCJI < Z2.DATA_TRANSAKCJI
)
Ewentualnie w MS SQL przy użyciu funkcji okienkowych:
WITH Temp AS(
SELECT Z.*,
LEAD(Z.DATA_TRANSAKCJI , 1, NULL) OVER(PARTITION BY id ORDER BY data DESC) AS data_previous,
LEAD(Z.ZAKUP , 1, NULL) OVER(PARTITION BY id ORDER BY data DESC) AS type_previous
FROM Zakupy AS Z
)
SELECT Z.*
FROM Zakupy AS Z
JOIN Temp AS T
ON Z.ID_KLIENTA = T.ID_KLIENTA
AND T.ZAKUP = 'B'
AND T.type_previous <> 'B'
AND Z.DATA_TRANSAKCJI = T.DATA_TRANSAKCJI