Подсчитать всех лиц, которые подали заявку за последние 12 месяцев, сгруппированных в месяц - PullRequest
1 голос
/ 28 мая 2019

У меня есть эти образцы таблиц:

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 в месяц. Это будет ежемесячный отчет.

Примеры сценариев :

  1. Person1 был зарегистрирован Jan 01, 2018 и с тех пор никогда не подавал заявки до тех пор, пока Jan 01, 2019 не подал свой первый билет. При этом Person1 будет считаться Contributor только за январь 2019 г., но он является обычным участником с Jan 2018 до Dec 2018.
  2. Person1 подал еще один билет в Feb 2019. Несмотря на то, что он подал новый билет, он все равно не учитывается в Feb 2019 записях участников, которые стали Contributor, поскольку он уже является Contributor в Jan 2019
  3. 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 выше: cte

EDIT

Добавлены дамп данных и точки анализа.

Очки

  1. В 2018-02 PersonID 4 стал участником. Никто не подал билет, кроме него. Это даст нам строку с:

    LeadID: 1, PeriodYear: 2018, PeriodMonth: 2, Contributor: 1

  2. В 2018-03 году никто иной, как PersonID 5, не стал участником. Опять же, это даст нам еще один ряд:

    LeadID: 1, PeriodYear: 2018, PeriodMonth: 3, Contributor: 1

  3. В 2018-04 г. PersonID 6 стал участником:

    LeadID: 1, PeriodYear: 2018, PeriodMonth: 4, Contributor: 1

  4. С 2018-05 по 2019-01, никто больше не стал Участником. PersonID 6 здесь не учитывается, потому что он все еще является участником.

  5. В 2019-01 году PersonID 2 и 3 стали участниками. Это их первая подача заявки. Опять же, PersonID 6 по-прежнему является участником. Это даст нам строку:

    LeadID: 1, PeriodYear: 2019, PeriodMonth: 1, Contributor: 2

  6. В 2019-02 PersonID 4 снова стал обычным участником, а не участником, поскольку прошло уже 12 месяцев, и с тех пор он не подавал никаких заявок. Для этого строка не нужна.

  7. В 2019-03 PersonID 5 становится обычным членом (та же логика в пункте # 6). Человек 3 подал заявку, но он все еще участвует. В целом, строка не нужна.

  8. В 2019-05 Лицо 2 подало заявку, но он все еще является участником. Человек 4 подал заявку, и он уже является постоянным участником, поэтому он теперь Автор:

    LeadID: 1, PeriodYear: 2019, PeriodMonth: 5, Contributor: 1

  9. В 2019-06 Person 5 становится участником:

    LeadID: 1, PeriodYear: 2018, PeriodMonth: 5 Contributor: 1

  10. В 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

Надеюсь, это поможет прояснить мой вопрос.

Ответы [ 3 ]

2 голосов
/ 29 мая 2019

Создайте функцию, которая получает список отправленных билетов за последние 12 месяцев

ALTER FUNCTION func_isContributor(@dateFiled as DATE, @PersonID as INTEGER)
RETURNS  INTEGER
AS
BEGIN
    return 
        (SELECT
            count(*)
        FROM
            tmp_tickets
        WHERE 
            DateFiled BETWEEN  DATEADD(month, -12, @dateFiled) and  @dateFiled AND SubmittedBy = @PersonID)
END

, затем проверьте, есть ли у человека запись за последние 12 месяцев

; with cte as (
    SELECT 
        SubmittedBy,
        DateFiled,
        isCounted = case when dbo.func_isContributor(DateFiled,SubmittedBy) -1 = 0 then 1 else 0 END
    FROM
        tmp_tickets
)
SELECT
    lead.PersonID,
        ContributorCount = Count(1),
        PeriodMonth = MONTH(DateFiled),
        PeriodYear = YEAR(DateFiled)
FROM tmp_assigned_lead lead
INNER JOIN cte
    ON lead.AssignedPersonID = cte.SubmittedBy and cte.isCounted = 1
GROUP BY 
    lead.PersonID,
    MONTH(DateFiled),
    YEAR(DateFiled)
1 голос
/ 28 мая 2019

вы можете использовать условие where

DATEDIFF(MONTH, DateFiled, GETDATE()) <=12
group by MONTH(DateFiled)
0 голосов
/ 28 мая 2019

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

CREATE TABLE #tmp_persons (
PersonID int primary key identity
, FirstName varchar(max)
, LastName varchar(max)
, isContributor int
, contributorSince datetime 

)

Каждый раз, когда человек создает заявку, проверяйте, пора ли обновлять contributorSince и isContributor. Если да, обновите его, иначе оставьте как есть.

Группировка лиц по personId и contributorSince (месяц, год, ...), где для isContributor установлено значение true , а contributorSince находится в пределах интересующего вас периода.

isContributor не обязательно. Так как вы можете сделать это только с contributorSince

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...