Reputation: 441
I have a database of customers with this columns (sample) :
ID | TIMESTAMP | TYP_EVEN | NAME | COUNTRY | GENDER | NBR_CHILDREN | ADRESS | CUSTOMER_LINKED | TYP_OF_LINK |
---|---|---|---|---|---|---|---|---|---|
044348547 | 2020-09-08-02.02.21.442908 | 0004 | NXXX CORINNE | FRA | 2 | 02 | 000000000 | ||
044379039 | 2020-07-17-11.17.55.410843 | 0013 | 00 | 11 RUE XXXX XXX | 000000000 | ||||
044379039 | 2020-07-21-16.45.53.485200 | 0004 | KXXX STEPHANE | FRA | 1 | 00 | 000000000 | ||
044379039 | 2020-08-05-02.02.41.403053 | 0004 | KXXX STEPHANE | FRA | 1 | 00 | 000000000 | ||
044385911 | 2019-01-31-02.03.22.455660 | 0004 | SXXX PHILIPPE | FRA | 1 | 02 | 000000000 | ||
044385911 | 2020-09-18-15.46.31.387588 | 0004 | SXXX PHILIPPE | FRA | 1 | 02 | 000000000 | ||
044385911 | 2020-09-30-02.01.45.310449 | 0004 | SXXX PHILIPPE | FRA | 1 | 02 | 000000000 | ||
044385911 | 2020-10-01-00.06.20.341427 | 0013 | 00 | 19 RUE XXXX XXXX | 000000000 | ||||
044680501 | 2021-03-10-02.02.42.979297 | 0004 | HXXX STEPHANE | FRA | 1 | 00 | 000000000 | ||
044680501 | 2021-03-10-02.02.42.980069 | 0013 | 00 | 22 RUE XXXX XXXX | 000000000 | ||||
044680501 | 2021-03-10-02.02.42.981083 | 0029 | 00 | 044680519 | MARIED | ||||
044680519 | 2021-03-10-02.02.42.966522 | 0004 | HXXX LIDWINE | FRA | 2 | 02 | 000000000 | ||
044680519 | 2021-03-10-02.02.42.970031 | 0029 | 00 | 044680501 | MARIED |
TYP_EVEN : is type of event about the record for each customers ID, then OOO4 : is about informations of the customer (NAME, COUNTRY, GENDER, Number of children), 0013 : is about the ADRESS informations and 0029 : is about link beetwen customers
I would like to have one row by ID with all informations. I proceed like this :
SELECT
T1.ID,
CASE WHEN T1.TYP_EVEN = '0004' THEN T1.NAME END AS NAME,
CASE WHEN T1.TYP_EVEN = '0004' THEN T1.COUNTRY END AS COUNTRY,
CASE WHEN T1.TYP_EVEN = '0004' THEN T1.GENDER END AS GENDER,
CASE WHEN T1.TYP_EVEN = '0004' THEN T1.NBR_CHILDREN END AS NBR_CHILDREN,
CASE WHEN T1.TYP_EVEN = '0013' THEN T1.ADRESS END AS ADRESS,
CASE WHEN T1.TYP_EVEN = '0029' THEN T1.CUSTOMER_LINKED END AS CUSTOMER_LINKED,
CASE WHEN T1.TYP_EVEN = '0029' THEN T1.TYP_OF_LINK END AS TYP_OF_LINK
,T1.TIMESTAMP
FROM DB.CUSTOMERS T1
GROUP BY GROUP BY T1.ID,T1.TIMESTAMP, T1.TYP_EVEN,T1.NAME,T1.COUNTRY,T1.GENDER,T1.NBR_CHILDREN,T1.ADRESS
,T1.CUSTOMER_LINKED, T1.TYP_OF_LINK
ORDER BY 1
the result should be :
ID | NAME | COUNTRY | GENDER | NBR_CHILDREN | ADDRESS | CUSTOMER_LINKED | TYP_OF_LINK | ||
---|---|---|---|---|---|---|---|---|---|
044348547 | NXXX CORINNE | FRA | 2 | 02 | 11 RUE XXXX XXX | 000000000 | |||
044379039 | KXXX STEPHANE | FRA | 1 | 00 | 000000000 | ||||
044385911 | SXXX PHILIPPE | FRA | 1 | 02 | 19 RUE XXXX XXXX | 000000000 | |||
044680501 | HXXX STEPHANE | FRA | 1 | 00 | 22 RUE XXXX XXXX | 044680519 | MARIED | ||
044680519 | HXXX LIDWINE | FRA | 2 | 02 | 044680501 | MARIED |
More information: if an ID have 2 rows with same TYP_EVEN then choose the latter one by the TIMESTAMP.
Could someone have any idea to resolve this SQL Statement ?
Upvotes: 0
Views: 108
Reputation: 3202
Here is a way to do what you want
with customers (id, timestamp, typ_even, name, country, gender, nbr_children, adress, customer_linked, typ_of_link) as (
values
(044348547, timestamp('2020-09-08-02.02.21.442908'), 0004, 'NXXX CORINNE', 'FRA', 2, 02, NULL, 000000000, NULL),
(044379039, '2020-07-17-11.17.55.410843', 0013, NULL, NULL, NULL, 00, '11 RUE XXXX XXX', 000000000, NULL),
(044379039, '2020-07-21-16.45.53.485200', 0004, 'KXXX STEPHANE', 'FRA', 1, 00, NULL, 000000000, NULL),
(044379039, '2020-08-05-02.02.41.403053', 0004, 'KXXX STEPHANE', 'FRA', 1, 00, NULL, 000000000, NULL),
(044385911, '2019-01-31-02.03.22.455660', 0004, 'SXXX PHILIPPE', 'FRA', 1, 02, NULL, 000000000, NULL),
(044385911, '2020-09-18-15.46.31.387588', 0004, 'SXXX PHILIPPE', 'FRA', 1, 02, NULL, 000000000, NULL),
(044385911, '2020-09-30-02.01.45.310449', 0004, 'SXXX PHILIPPE', 'FRA', 1, 02, NULL, 000000000, NULL),
(044385911, '2020-10-01-00.06.20.341427', 0013, NULL, NULL, NULL, 00, '19 RUE XXXX XXXX', 000000000, NULL),
(044680501, '2021-03-10-02.02.42.979297', 0004, 'HXXX STEPHANE', 'FRA', 1, 00, NULL, 000000000, NULL),
(044680501, '2021-03-10-02.02.42.980069', 0013, NULL, NULL, NULL, 00, '22 RUE XXXX XXXX', 000000000, NULL),
(044680501, '2021-03-10-02.02.42.981083', 0029, NULL, NULL, NULL, 00, NULL, 044680519, 'MARIED'),
(044680519, '2021-03-10-02.02.42.966522', 0004, 'HXXX LIDWINE', 'FRA', 2, 02, NULL, 000000000, NULL),
(044680519, '2021-03-10-02.02.42.970031', 0029, NULL, NULL, NULL, 00, NULL, 044680501, 'MARIED')
)
select ID,NAME,COUNTRY,GENDER,NBR_CHILDREN,ADRESS,CUSTOMER_LINKED,TYP_OF_LINK from (
select
id,
last_value(name, 'IGNORE NULLS') over(partition by id order by timestamp) name,
last_value(country, 'IGNORE NULLS') over(partition by id order by timestamp) country,
last_value(gender, 'IGNORE NULLS') over(partition by id order by timestamp) gender,
last_value(nbr_children, 'IGNORE NULLS') over(partition by id order by timestamp) nbr_children,
last_value(adress, 'IGNORE NULLS') over(partition by id order by timestamp ) adress,
last_value(customer_linked, 'IGNORE NULLS') over(partition by id order by timestamp ) customer_linked,
last_value(typ_of_link, 'IGNORE NULLS') over(partition by id order by timestamp ) typ_of_link,
rownumber() over(partition by id order by timestamp desc) seq
from customers
) where seq = 1
order by id
See db<>fiddle, Corinne NXXX has no address
Upvotes: 1