SQL - 仅为日期最短的操作添加 +1

SQL - add +1 only for the action with lowest date

我有一个 table 这样的:

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 添加到完成特定操作的每个记录(项目),然后对所有这些操作求和,这样输出应该如下所示:

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

问题是我只需要为每条记录添加一次 +1,如果对该项目有更多操作,则此 OUTER APPLY 将在该项目上多次添加 +1。我只需要为该项目首先完成的操作添加 +1。 我在我的代码中使用 OUTER APPLY,我通过 CASE 添加 1,如下所示:

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

这部分代码将检查项目上是否存在 "Code A",如果存在,它将添加 +1。问题是该项目上也可能有 "Code B" 的操作。在那种情况下,我想仅在 "Code A" 操作在 "Code B".

之前完成时才向操作 "Code A" 添加 +1

我如何对 SQL 说 - 当存在操作 "Code A" 并且该操作在 "Action B""Action C" 之前对该项目完成时,然后添加 +1? 我也不能使用 CTE!我想在这个案例中这样做。

如果你想计算给定项目的每个动作首先出现的次数,你可以这样做

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.

聚合