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

问题描述 投票:0回答: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

我需要做的是向执行特定操作的每条记录(项)添加+1,然后将所有这些操作加起来,因此输出应如下所示:

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

问题是,我只需要为每条记录添加+1次,如果一个项目上有更多操作,则该外部应用将在一个项目上多次添加+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

这部分代码将检查项目中是否存在“代码A”,如果存在,它将添加+1。问题在于该项目上也可能带有“代码B”的操作。在那种情况下,仅当在“代码B”之前执行“代码A”操作时,我才想为操作“代码A”添加+1。

我如何对SQL说-当存在动作“代码A”并且该动作在该项目的“动作B”“动作C”之前完成,然后加+1吗?我也不能使用CTE!我想在这种情况下这样做。

sql-server tsql case exists
1个回答
0
投票

如果您要计算给定项目每个动作第一次出现的次数,则可以执行

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进行汇总。

© www.soinside.com 2019 - 2024. All rights reserved.