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
.
聚合
我有一个 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
.