我有一张这样的桌子:
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!我想在这种情况下这样做。
如果您要计算给定项目每个动作第一次出现的次数,则可以执行
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
进行汇总。