Добавление условного предложения (где) в функцию плотного ранга - PullRequest
1 голос
/ 31 октября 2019

Я хочу создать функцию ранга для подсчета количества посещений человеком объекта BY DATE, но с условием не включать категорию посещения. 'Calls'

DENSE_RANK() over(partition by activitytable.[Property] 
ORDER BY activitytable.[Date] as Job rank

Это занимает всю таблицу связи, которая мне не нужна.

TABLE

---- ActivityID ---------- Свойство -------- ДАТА ------CommunicationType ---------------- Rank

1046        Red Property      30/10/2019           Field                  2                      
10467       Red Property      29/10/2019           Field                  1
10591       Red Property      28/10/2019          Calls                   
10971       Blue Property     27/10/2019           Field                  2
10971       Blue Property     26/10/2019           Field                  1
10971       Blue Property     26/10/2019           calls                     
10965       Green Property    24/10/2019           calls
10765       Green Property    23/10/2019           calls
10765       Green Property    19/10/2019           field                  3
10765       Green Property    15/10/2019           field                  2
10765       Green Property    12/10/2019           field                  1

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

Ответы [ 3 ]

2 голосов
/ 31 октября 2019

Вам нужно разделить на Property и CommunicationType:

Таблица:

CREATE TABLE #Data (
    ActivityID int,
    Property varchar(100),
    [DATE] date,
    CommunicationType varchar(10)
)
INSERT INTO #Data
    (ActivityID, Property, [DATE], CommunicationType)
VALUES
    (1046,  'Red Property',    '20191030', 'field'),
    (10467, 'Red Property',    '20191029', 'field'),
    (10591, 'Red Property',    '20191028', 'calls'),
    (10971, 'Blue Property',   '20191027', 'field'),
    (10971, 'Blue Property',   '20191026', 'field'),
    (10971, 'Blue Property',   '20191026', 'calls'),
    (10965, 'Green Property',  '20191024', 'calls'),
    (10765, 'Green Property',  '20191023', 'calls'),
    (10765, 'Green Property',  '20191019', 'field'),
    (10765, 'Green Property',  '20191015', 'field'),
    (10765, 'Green Property',  '20191012', 'field')

Заявление:

SELECT 
    *,
    CASE 
        WHEN CommunicationType = 'field' THEN DENSE_RANK() OVER (PARTITION BY Property, CommunicationType ORDER BY [DATE] ASC)
        ELSE NULL
    END AS Rank
FROM #Data

Результат:

ActivityID  Property    DATE        CommunicationType   Rank
10971   Blue Property   2019-10-26  calls               NULL
10971   Blue Property   2019-10-26  field               1
10971   Blue Property   2019-10-27  field               2
10765   Green Property  2019-10-23  calls               NULL
10965   Green Property  2019-10-24  calls               NULL
10765   Green Property  2019-10-12  field               1
10765   Green Property  2019-10-15  field               2
10765   Green Property  2019-10-19  field               3
10591   Red Property    2019-10-28  calls               NULL
10467   Red Property    2019-10-29  field               1
1046    Red Property    2019-10-30  field               2
1 голос
/ 31 октября 2019

У вас нет повторяющихся дат, поэтому просто используйте кумулятивную сумму:

sum(case when communicationtype <> 'Calls'
         then 1 else 0
    end) over (partition by activitytable.[Property] order by activitytable.[Date]
              ) as Job_rank

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

Если вам нужно dense_rank(), потому что есть дубликаты, тогда ответ более сложный. Следующее должно делать то, что вы хотите:

select (case when communicationtype = 'Visits'
             then dense_rank() over (partition by activitytable.[Property], communicationtype
                                     order by activitytable.[Date]
                                    )
        end) as job_rank

Примечание: значение не будет отображаться в строках с Calls. Не ясно, если это необходимо.

1 голос
/ 31 октября 2019

Просто попробуйте:

CASE WHEN CommunicationType <> 'CAlls' THEN DENSE_RANK() over(partition by activitytable.[Property] ORDER BY activitytable.[Date] ELSE NULL END AS Job rank
...