sql 在每天结束时关闭不同的计数

Posted

技术标签:

【中文标题】sql 在每天结束时关闭不同的计数【英文标题】:sql closing distinct counts at end of each day 【发布时间】:2016-03-21 12:54:20 【问题描述】:

您好,我需要在每天结束时计算状态 = 'AA' 的不同门牌号的关闭计数。

所以在 2016 年 3 月 19 日结束时 - 如果我们有 3 个不同的房子 H1、H2、H3,AA 计数 = 3 如果我们在 2016 年 3 月 20 日再次有 H2 记录 AA 和 h4,h5 和 AA ,则期末余额 = 5 在 2016 年 3 月 21 日,如果 2 栋房子搬出 AA,另外 3 栋房子被添加到 AA,那么计数将是 = 6

谁能帮我用 sql 解决这个问题。

数据库 = Netezza 。

所以基本上我需要计算从时间开始到那一天具有状态 AA 的不同房屋的数量,每一天作为当天房屋的关闭计数。[CLsBal 是所需的推导]

ReleaseDate|HNo|Status|HType|RelReason|  ValidFrm |  ValidTo |ClsBal
-------------------------------------------------------------------
01-Jan-16   H1    AA      R      XYZ    01-Jan-16   01-Jan-16   2
01-Jan-16   H2    AA      R      XYZ    01-Jan-16   31/12/2999  2
02-Jan-16   H3    AA      R      XYZ    02-Jan-16   31/12/2999  4
02-Jan-16   H4    AA      R      XYZ    02-Jan-16   31/12/2999  4
02-Jan-16   H5    AA      R      XYZ    02-Jan-16   31/12/2999  4
02-Jan-16   H1    AB      R      XYZ    02-Jan-16   31/12/2999  4
03-Jan-16   H6    AA      R      XYZ    02-Jan-16   31/12/2999  8
03-Jan-16   H7    AA      R      XYZ    02-Jan-16   31/12/2999  8
03-Jan-16   H8    AA      R      XYZ    02-Jan-16   31/12/2999  8
03-Jan-16   H9    AA      R      XYZ    02-Jan-16   31/12/2999  8
03-Jan-16   H3    AA      R      XYZ    02-Jan-16   31/12/2999  8

下面的代码是查找给定日期的收盘余额的逻辑:

select cast('31-dec-2015' as date ) as RELEASEDATE,
    HNo,  
    HType,
    count(distinct Hno ) as ClosingCount
from HouseChanges
where  ReleaseDate <= '31-dec-2015'  
    and Status='AA'  -- House Status
    and ValidTo >= '31-dec-2015'
group by  RelReason,  Htype

我需要从 2015 年 12 月 31 日开始计算每一天

我们可以使用递归 CTE 来解决这个问题吗?

我尝试过,但它不断出错,而且 Aginity 不太擅长返回错误代码。

我用过这样的东西:

with closing as (
select cast('31-dec-2015' as date ) as RELEASEDATE,
HNo,  
HType,
count(distinct Hno ) as ClosingCount
from HouseChanges
where  ReleaseDate <= '31-dec-2015' 
and 
Status='AA'  -- House Status
and
VALID_TO_DATE >= '31-dec-2015'
 group by  RelReason,  Htype

union all

 select max(Release_date) as RELEASEDATE,
 HNo,  
HType,
count(distinct Hno ) as ClosingCount
from HouseChanges t1
inner join closing t2
on t1.Release_date <= t2. RELEASEDATE++interval '1 days'
where  
Status='AA'  -- House Status
and
VALID_TO_DATE >= t2. RELEASEDATE+interval '1 days'
and
t2. RELEASEDATE<=current_date
group by  RelReason,  Htype
)
 select * from closing 

原来 Netezza 不支持递归 CTE。有人可以建议我如何在不使用 CTE 的情况下执行此操作吗?

【问题讨论】:

您能补充一下您的数据是什么样的吗? 学校/家庭作业,或工作要求? 什么样的数据库:SQL-server、mysql、PostgreSQL、Oracle等?到目前为止,您尝试过什么?你被困在哪里了? 【参考方案1】:

我不完全理解您所描述的要求,但这是我的猜测。应该可以为此使用窗口功能,但我不知道您是否有可用的功能:

select
    ReleaseDate, HNo, HType,
    (
        select count(distinct hc2.Hno)
        from HouseChanges hc2
        where hc2.ReleaseDate <= hc.ReleaseDate
            and Status = 'AA' and ValidTo >= '31-dec-2015'
    ) as ClosingCount
from HouseChanges hc
where Status = 'AA' and ValidTo >= '31-dec-2015'
group by ReleaseDate, HNo, HType

【讨论】:

以上是关于sql 在每天结束时关闭不同的计数的主要内容,如果未能解决你的问题,请参考以下文章

两个日期之间每天未结订单的 SQL 计数

oracle sql中根据其他表中的计数重新启动rownumber

SQL 具有多个条件的多个计数列

每天的 SQL 计数并在接下来的所有日子里加在一起

SQL 计算自当月第一天以来每天的累积 Distinct 计数

SQL - 连接两个表时无法执行不同的计数