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”,但其工作速度非常缓慢。你有什么想法或常用的方法,如何使它更快?选项强制顺序,针对未知优化,没有多大帮助。