Wcześniejsze operacje

0

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

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  

1 użytkowników online, w tym zalogowanych: 0, gości: 1