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 在每天结束时关闭不同的计数的主要内容,如果未能解决你的问题,请参考以下文章
oracle sql中根据其他表中的计数重新启动rownumber