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

SQL-仅为日期最低的操作添加+1,sql,sql-server,tsql,case,exists,Sql,Sql Server,Tsql,Case,Exists,我有一张这样的桌子: 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 Action_Code Total_n

我有一张这样的桌子:

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
Action_Code       Total_number_of_actions
Code'A'            5
Code'B'            8
Code'C'           11
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
我需要做的是将+1添加到每个执行特定操作的记录项中,然后将所有这些操作相加,以便输出如下所示:

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
Action_Code       Total_number_of_actions
Code'A'            5
Code'B'            8
Code'C'           11
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
问题是,我只需要为每个记录添加一次+1,如果在一个项目上有更多操作,那么这个外部应用将在该项目上添加多次+1。我只需要将+1添加到首先对该项执行的操作。 我在代码中使用了OUTER APPLY,并添加了1 via案例,如下所示:

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
Action_Code       Total_number_of_actions
Code'A'            5
Code'B'            8
Code'C'           11
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的操作。在这种情况下,仅当代码A操作在代码B之前完成时,我想向操作代码A添加+1

我如何对SQL说-当存在操作代码A并且该操作是在该项上的操作代码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

子查询通过递增操作的日期对具有相同项标识的记录进行排序;外部查询过滤每个组的第一条记录,并按操作代码进行聚合。

您的样本数据与样本输出不匹配。谢谢。先生,你是我今天的MVP!还有一个问题-从选择a中选择count Pocet_prvnich时外部应用选择案例。,行号由a.item\u id1由a.dateof action rn从dbo.action a超额分配,其中a.ActionType\u id1在20403年,21 a其中rn=1和a.item\u id1=i.item\u Id和a.ActionType\u id1=20由a.ActionType\u id1分组,不在0中,则1其他0结束为“action a”,但其工作速度非常缓慢。你有什么想法或常用的方法,如何使它更快?选项强制顺序,针对未知优化,没有多大帮助。