У меня есть эти образцы таблиц:
CREATE TABLE #tmp_persons (
PersonID int primary key identity
, FirstName varchar(max)
, LastName varchar(max)
)
CREATE TABLE #tmp_tickets (
TicketNum int primary key identity
, Title varchar(max)
, Descr varchar(max)
, DateFiled datetime
, SubmittedBy int FOREIGN KEY REFERENCES #tmp_persons(PersonID)
)
CREATE TABLE #tmp_assigned_lead (
AssignmentID int primary key identity
, PersonID int FOREIGN KEY REFERENCES #tmp_persons(PersonID) -- ID of the Lead
, AssignedPersonID int FOREIGN KEY REFERENCES #tmp_persons(PersonID) -- ID of the person assigned
)
-- DATA DUMP
INSERT INTO #tmp_persons
VALUES
(1, 'John', 'Doe'), (2, 'Jane', 'Doe'),
(3, 'Carl', 'Smith'), (4, 'Jenny', 'Smith'),
(5, 'John', 'Wick'), (6, 'Stephanie', 'Mathews')
INSERT INTO #tmp_assigned_lead (PersonID, AssignedPersonID)
VALUES
(1, 2), (1, 3), (1, 4), (1, 5), (1, 6)
INSERT INTO #tmp_tickets (Title, Descr, DateFiled, SubmittedBy)
VALUES
('Ticket 1', 'blah', '01-01-2019', 2),
('Ticket 2', 'blah', '01-02-2019', 2),
('Ticket 3', 'blah', '05-01-2019', 4),
('Ticket 4', 'blah', '05-01-2019', 2),
('Ticket 5', 'blah', '06-01-2019', 5),
('Ticket 6', 'blah', '07-01-2019', 6),--
('Ticket 7', 'blah', '4-17-2018', 6),
('Ticket 8', 'blah', '12-30-2018', 6),
('Ticket 9', 'blah', '1-28-2019', 3),
('Ticket 10', 'blah', '3-16-2019', 3),
('Ticket 11', 'blah', '3-30-2018', 5),
('Ticket 12', 'blah', '2-4-2018', 4),
('Ticket 13', 'blah', '1-11-2019', 6),
('Ticket 14', 'blah', '9-5-2018', 6)
Итак, вот пункты:
- Каждый человек в
#tmp_persons
может иметь «лидерство», и это сохраняется в
реляционная таблица #tmp_assigned_lead
.
- Человек может подать билет
который хранится в
#tmp_tickets
- Человека называют
Contributor
, когда он подал заявку, но возвращается в качестве обычного участника, когда он не подает другой билет в течение 12 месяцев.
Теперь мое требование: я хочу подсчитать всех людей, находящихся под опережением, которые перешли в Contributor
в месяц. Это будет ежемесячный отчет.
Примеры сценариев :
Person1
был зарегистрирован Jan 01, 2018
и с тех пор никогда не подавал заявки до тех пор, пока Jan 01, 2019
не подал свой первый билет. При этом Person1
будет считаться Contributor
только за январь 2019 г., но он является обычным участником с Jan 2018
до Dec 2018
.
Person1
подал еще один билет в Feb 2019
. Несмотря на то, что он подал новый билет, он все равно не учитывается в Feb 2019
записях участников, которые стали Contributor
, поскольку он уже является Contributor
в Jan 2019
Person2
зарегистрирован в Feb 23, 2019
и сразу же подал билет. Это делает его / ее Contributor
и включается в число "членов, которые стали участниками" в месяце Feb 2019
.
Этот запрос, который я задал, группирует билеты на человека и месяц:
SELECT
SubmittedBy
, MaxDate = MAX(DateFiled)
, PeriodMonth = MONTH(DateFiled)
, PeriodYear = YEAR(DateFiled)
FROM #tmp_tickets
GROUP BY
SubmittedBy
, MONTH(DateFiled)
, YEAR(DateFiled)
Это то место, где я нахожусь на контрольно-пропускном пункте. Я не могу придумать запрос, который вернет число участников, которые стали Contributors
.
Это то, что я имею до сих пор. Я использовал вышеупомянутый запрос как CTE
:
;with cte as (
SELECT
SubmittedBy
, MaxDate = MAX(DateFiled)
, PeriodMonth = MONTH(DateFiled)
, PeriodYear = YEAR(DateFiled)
FROM #tmp_tickets
GROUP BY
SubmittedBy
, MONTH(DateFiled)
, YEAR(DateFiled)
)
SELECT
lead.PersonID
, ContributorsCnt = COUNT(1)
, PeriodMonth
, PeriodYear
FROM #tmp_assigned_lead lead
INNER JOIN cte
ON lead.AssignedPersonID = cte.SubmittedBy
-- WHERE??
-- check if member has no tickets in the past 12 months
GROUP BY
lead.PersonID
, PeriodMonth
, PeriodYear
Здесь для каждой выборки данных вот как выглядят записи в cte
выше:
EDIT
Добавлены дамп данных и точки анализа.
Очки
В 2018-02 PersonID 4 стал участником. Никто не подал билет, кроме него. Это даст нам строку с:
LeadID: 1, PeriodYear: 2018, PeriodMonth: 2, Contributor: 1
В 2018-03 году никто иной, как PersonID 5, не стал участником. Опять же, это даст нам еще один ряд:
LeadID: 1, PeriodYear: 2018, PeriodMonth: 3, Contributor: 1
В 2018-04 г. PersonID 6 стал участником:
LeadID: 1, PeriodYear: 2018, PeriodMonth: 4, Contributor: 1
С 2018-05 по 2019-01, никто больше не стал Участником. PersonID 6 здесь не учитывается, потому что он все еще является участником.
В 2019-01 году PersonID 2 и 3 стали участниками. Это их первая подача заявки. Опять же, PersonID 6 по-прежнему является участником. Это даст нам строку:
LeadID: 1, PeriodYear: 2019, PeriodMonth: 1, Contributor: 2
В 2019-02 PersonID 4 снова стал обычным участником, а не участником, поскольку прошло уже 12 месяцев, и с тех пор он не подавал никаких заявок. Для этого строка не нужна.
В 2019-03 PersonID 5 становится обычным членом (та же логика в пункте # 6). Человек 3 подал заявку, но он все еще участвует. В целом, строка не нужна.
В 2019-05 Лицо 2 подало заявку, но он все еще является участником. Человек 4 подал заявку, и он уже является постоянным участником, поэтому он теперь Автор:
LeadID: 1, PeriodYear: 2019, PeriodMonth: 5, Contributor: 1
В 2019-06 Person 5 становится участником:
LeadID: 1, PeriodYear: 2018, PeriodMonth: 5 Contributor: 1
В 2019-07, Человек 6 подал заявку, но он все еще является участником, так как его последний билет был подан 2019-01. ( Какой занятой человек! )
Ожидаемый набор данных :
LeadID: 1, PeriodYear: 2018, PeriodMonth: 2, Contributor: 1
LeadID: 1, PeriodYear: 2018, PeriodMonth: 3, Contributor: 1
LeadID: 1, PeriodYear: 2018, PeriodMonth: 4, Contributor: 1
LeadID: 1, PeriodYear: 2019, PeriodMonth: 1, Contributor: 2
LeadID: 1, PeriodYear: 2019, PeriodMonth: 5, Contributor: 1
LeadID: 1, PeriodYear: 2018, PeriodMonth: 5 Contributor: 1
Надеюсь, это поможет прояснить мой вопрос.