SQL - добавить +1 только для акции с наименьшей датой - PullRequest
0 голосов
/ 13 марта 2020

У меня есть таблица, подобная этой:

Item_ID   Action_Code         Date_of_action
1           Code'A'            2019-01-01
1           Code'B'            2019-01-15
1           Code'C'            2019-02-05
2           Code'B'            2020-03-05

Что мне нужно сделать, это добавить +1 к каждой записи (Элементу), в которой было выполнено указанное действие c, а затем СУММИТЬ все эти действия так, выходные данные должны выглядеть следующим образом:

Action_Code       Total_number_of_actions
Code'A'            5
Code'B'            8
Code'C'           11

Проблема в том, что мне нужно добавить +1 только ОДИН РАЗ за запись, это НАРУЖНОЕ ПРИМЕНЕНИЕ добавило бы +1 несколько раз для одного элемента, если было бы больше действий над этот пункт. Мне нужно добавить +1 только к действию, которое было выполнено ПЕРВЫМ над этим элементом. Я использую OUTER APPLY в своем коде и добавляю 1 через CASE следующим образом:

OUTER APPLY(
SELECT
CASE WHEN 
 EXISTS
(
SELECT 1
FROM dbo.Action a1 
INNER JOIN dbo.ActionType at1 
    ON at1.ActionType_id = a1.ActionType_id1
        WHERE at1.Code in ('Code A')
        AND a1.Item_id1 = i.Item_Id

)
THEN 1 ELSE 0 END AS 'Code A'
)MyOuterApply

Эта часть кода будет проверять, существует ли «Код A» на элементе, и если это так, то будет добавить +1. Проблема в том, что на этом элементе также может быть действие с «Кодом B». В этом случае я хочу добавить +1 к действию «Код А», только если действие «Код А» было выполнено до «Кода В».

Как я могу сказать SQL - Когда существует действие «Код А», и это действие было выполнено до «Действие Б» «Действие C» на этот элемент, затем добавьте +1? Также я не могу использовать CTE! Я хотел бы сделать это в этом случае.

1 Ответ

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

Если вы хотите подсчитать, сколько раз каждое действие появляется первым для данного элемента, вы можете сделать

select action_code, count(*) no_actions
from (
    select a.*, row_number() over(partition by item_id order by date_of_action) rn
    from dbo.action a
) a
where rn = 1
group by action_code

Подзапрос оценивает записи с одинаковым item_id по возрастанию date_of_action; внешние запросы фильтруют первую запись для каждой группы и агрегируют по action_code.

...