gpt4 book ai didi

tsql - 满足 SQL Server 2008 第一天标准

转载 作者:行者123 更新时间:2023-12-02 10:44:08 24 4
gpt4 key购买 nike

我有一个如下所示的数据表(将有数百万条记录,但我会在这里简单化)。

ID   APPROVAL_DT       DAY_DT        TRANS_COUNT     SALE_AMOUNT
1 2010-04-22 2010-04-27 2 260
1 2010-04-22 2010-04-28 1 40
2 2010-03-28 2010-04-02 1 5
2 2010-03-28 2010-04-03 5 10
2 2010-03-28 2010-04-04 1 20
3 2010-04-25 2010-05-01 6 10
3 2010-04-25 2010-05-02 4 10
4 2010-06-01 2010-06-07 1 5

我需要计算出每个 ID 的 DAY_DT,其中所有先前和当前 DAY_DT TRANS_COUNT 的总和 >=10,或者所有先前和当前 DAY_DT SALE_AMOUNT 的总和 >= 25

因此应用于上表的查询结果将是

ID   APPROVAL_DT  ACTIVATED_DT
1 2010-04-22 2010-04-27
2 2010-03-28 2010-04-04
3 2010-04-25 2010-05-02
4 2010-06-01 NULL

有什么想法吗?

最佳答案

我假设您的意思是您想要在 ID 内查找第一个 day_dt,其前一个 day_dt 的总和为 trans_count >= 10 或 sales_amount >= 25。您将其称为找到的日期“activated_dt”。您的描述与此完全不同,因为它没有指定您只需要第一天,并且它要求所有天的总和,而您的示例结果显示总和截至当天。

我同意 Martin 的观点,即运行总计将是性能最好的,因为它可以在一次扫描表中产生结果。

没有运行总计的结果必须计算每个 day_dt 前几天的总计,然后为每个 ID 选择第一个:

with cte1 as (
select
t.id,
t.approval_dt,
t.day_dt as activated_dt
from Table t
cross apply (
select sum(trans_count) as sum_tc,
sum(sale_amount) as sum_sa,
max(day_dt) as max_day_dt
from table c
where c.id = t.id
and c.day_dt <= t.day_dt) as p
where p.sum_tc >= 10
or p.sum_sa >=25)
, cte2 as (
select id
, approval_dt
, activated_dt
, row_number() over (partition by id order by activated_dt) as rn
from cte1)
select *
from cte2
where rn = 1;

关于tsql - 满足 SQL Server 2008 第一天标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3513092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com