SQL Запрос на поиск нового или возвращающегося клиента в зависимости от того, посетил ли тот или иной участник какое-либо мероприятие в любой предыдущий год - PullRequest
0 голосов
/ 28 марта 2020

Я использую T SQL и ищу написать запрос для следующей проблемы

У меня есть список людей, посещающих список событий, которые происходят каждый год - например, событие с именем DevConf, PartConf происходит каждый год - перечисленные в таблице ниже

    EventName          EventID      ParticipantName 
    2015 DevConf        01            alex
    2015 DevConf        01            bob
    2016 PartConf       02            james
    2016 PartConf       02            Kevin
    2016 DevConf        03            alex
    2016 DevConf        03            Stev
    2017 PartConf       04            adam
    2017 PartConf       04            Kevin

Я хочу определить, является ли клиент новым или возвращается, основываясь на том, посетил ли тот же случай в предыдущем году. Пример - «alex», который посещает DevConf 2016, должен быть идентифицирован как «Возвращение», поскольку он участвовал в том же мероприятии Devconf в 2015 году (DevConf 2015), и поэтому «Кевин» для PartConf 2017 года, так как он посещал «PartConf 2016», другие должны быть идентифицированным как «Новый». Это то, что я придумал

Select eventName, 
EventId, ParticipantName, 
ReturningOrNew = Partition by eventName like '%DevConf%',
 case when ParticipantName then 'Existing' Else 'New' End
From Table1

Я очень новичок в SQL, и любая помощь по этому вопросу очень ценится, спасибо.

Ответы [ 3 ]

0 голосов
/ 28 марта 2020

Я бы использовал row_number() для этого:

select t.*,
       (case when row_number() over (partition by eventName, participantName order by year) > 1
             then 'returning' else 'New'
        end)
from t;

Примечание. Это означает, что «предыдущий год» интерпретируется как любой предыдущий год, а не только годом ранее.

0 голосов
/ 28 марта 2020

Из-за того, как хранятся ваши данные, вам, к сожалению, придется искать, используя строковые имена событий, чтобы узнать, посещал ли кто-нибудь это событие раньше. Я бы начал с CTE, чтобы получить список событий и участников, затем go оттуда.

;WITH cte_conf_Id AS (
select 
     ParticipantName,
     CASE WHEN EventName LIKE "%DevConf" THEN "DevConf" ELSE null AS ConfName
     ...
)

И затем вы можете присоединиться к существующей таблице на go оттуда. Но я бы подумал, как это лучше структурировать. В идеале у вас должен быть уникальный идентификатор для каждого типа конференции (таким образом, каждый DevConf равен 101, каждый PartConf равен 102 и т. Д. c.) И тогда это будет намного проще.

0 голосов
/ 28 марта 2020

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

Вы можете использовать оконные функции: lag() позволяет восстановить предыдущий год участник посетил данное событие (если есть), которое можно сравнить с текущим годом для вычисления статуса.

select
    t.*,
    case when lag(eventYear) over(partition by eventName, participantName order by eventYear) = eventYear + 1
        then 'Returning'
        else 'New'
    end status
from mytable t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...