Написать SQL запрос для данного сценария - PullRequest
0 голосов
/ 20 января 2020

У нас есть таблица без даты или добавочный столбец int, как показано ниже.

create table test(
id uniqueidentifier DEFAULT newsequentialid(),
userid int, 
type int, 
value varchar(20)
);

Нам нужен идентификатор пользователя со значением, основанным на следующих логиках c, первые данные в случае первичных данных else последние в случае другого типа.

Available type column value 
-------------
0 - None
1 - Primary
2 - Other
3 - Registered

Logic to retrieve value should be as below : 

if Primary available : 
    take "first" Primary's Value 
else if Registered available :
    take "last" Registered's Value
else if Other available :
    take "last" Other's Value
else 
    take "last" None's Value

Создано несколько сценариев ios, чтобы лучше понять требования.

Сценарий 1:

/*
Output should be as below
userid, value 
-------------
1, User1 value1.1
2, User2 value4.2
*/
insert into test (userid, type, value) values(1, 1, 'User1 value1.1')
insert into test (userid, type, value) values(1, 1, 'User1 value1.2')
insert into test (userid, type, value) values(1, 2, 'User1 value2.1')
insert into test (userid, type, value) values(1, 2, 'User1 value2.2')
insert into test (userid, type, value) values(1, 4, 'User1 value4.1')
insert into test (userid, type, value) values(1, 4, 'User1 value4.2')
insert into test (userid, type, value) values(2, 0, 'User2 value0.1')
insert into test (userid, type, value) values(2, 0, 'User2 value0.2')
insert into test (userid, type, value) values(2, 4, 'User2 value4.1')
insert into test (userid, type, value) values(2, 4, 'User2 value4.2')

Сценарий 2:

/* 
Output should be as below
userid, value 
-------------
3, User3 value1.1
4, User4 value4.2
*/
insert into test (userid, type, value) values(3, 0, 'User3 value0.1')
insert into test (userid, type, value) values(3, 1, 'User3 value1.1')
insert into test (userid, type, value) values(3, 2, 'User3 value2.1')
insert into test (userid, type, value) values(3, 2, 'User3 value2.2')
insert into test (userid, type, value) values(4, 4, 'User4 value4.1')
insert into test (userid, type, value) values(4, 4, 'User4 value4.2')
insert into test (userid, type, value) values(4, 2, 'User4 value2.1')
insert into test (userid, type, value) values(4, 0, 'User4 value0.1')

Сценарий 3:

/* 
Output should be as below
userid, value 
-------------
5, User5 value2.1
6, User6 value0.3
*/
insert into test (userid, type, value) values(5, 2, 'User1 value1.1')
insert into test (userid, type, value) values(5, 2, 'User1 value2.1')
insert into test (userid, type, value) values(5, 0, 'User1 value0.1')
insert into test (userid, type, value) values(6, 0, 'User6 value0.1')
insert into test (userid, type, value) values(6, 0, 'User6 value0.2')
insert into test (userid, type, value) values(6, 0, 'User6 value0.3')

Высоко ценю любую помощь.

1 Ответ

0 голосов
/ 20 января 2020

Это то, что вы хотите?

select t.*
from (select t.*,
             row_number() over (partition by user_id
                                order by (case when type = 1 then 1 when type = 3 then 2 when type = 2 then 3 else 4 end),
                                         (case when type = 1 then id end) asc,
                                         id desc
                               ) as seqnum
      from test t
     ) t
where seqnum = 1;
...