Sql 如何获得计数的滚动视图?
目标是统计从指定日期起三个月内符合标准的任何人。这(介于3个月之间)是一个棘手的部分。我在一个年度窗口内工作,从Sql 如何获得计数的滚动视图?,sql,oracle,to-date,Sql,Oracle,To Date,目标是统计从指定日期起三个月内符合标准的任何人。这(介于3个月之间)是一个棘手的部分。我在一个年度窗口内工作,从getDate()开始不到3个月,我需要从Y开始不到3个月的时间。有什么想法吗 CREATE TABLE MONTH3LOOK AS Select to_CHAR(DATE_OF_SERVICE_3013,'YYYY-MM') "Date" ,COUNT(DISTINCT case when (regexp_instr(IS_CONCAT,'(2957|29570|29571|29
getDate()
开始不到3个月,我需要从Y开始不到3个月的时间。有什么想法吗
CREATE TABLE MONTH3LOOK AS Select
to_CHAR(DATE_OF_SERVICE_3013,'YYYY-MM') "Date"
,COUNT(DISTINCT case when (regexp_instr(IS_CONCAT,'(2957|29570|29571|29572|29573|29574|29575|29576|29577|29578|29579)')>0)
and
(DATE_OF_SERVICE_3013 between trunc(DATE_OF_SERVICE_3013,'MM') and add_months(trunc(DATE_OF_SERVICE_3013,'MM'),-3))
then USER end) AS Recip
FROM .NET_SERVICE
WHERE DATE_OF_SERVICE_3013 BETWEEN
TO_DATE('2013-10','YYYY-MM') AND
TO_DATE('2014-03','YYYY-MM')
group by to_CHAR(DATE_OF_SERVICE_3013,'YYYY-MM')
由于包含group by运算符会干扰分析函数的操作,因此可能需要使用分析函数来获取计数和distinct运算符来模拟group by:
select distinct trunc(date_of_service_3013,'MM') "Date"
, count(case when regexp_like(IS_CONCAT, '(1234|5678|etc)') then user end)
over (order by trunc(date_of_service_3013, 'mm')
range between interval '3' month preceding
and current row) recip
from your_table
where DATE_OF_SERVICE_3013 BETWEEN TO_DATE('2013-10','YYYY-MM')
AND TO_DATE('2014-03','YYYY-MM');
select trunc(date_of_service_3013,'MM') "Date"
, sum(count(case when regexp_like(IS_CONCAT, '1234|5678|etc') then user end))
over (order by trunc(date_of_service_3013, 'mm')
range between interval '3' month preceding
and current row) recip
from your_table
group by trunc(date_of_service_3013,'MM')
where DATE_OF_SERVICE_3013 BETWEEN TO_DATE('2013-10','YYYY-MM')
AND TO_DATE('2014-03','YYYY-MM');
考虑分组操作影响的另一种方法是更改分析函数和聚合函数的用法:
select distinct trunc(date_of_service_3013,'MM') "Date"
, count(case when regexp_like(IS_CONCAT, '(1234|5678|etc)') then user end)
over (order by trunc(date_of_service_3013, 'mm')
range between interval '3' month preceding
and current row) recip
from your_table
where DATE_OF_SERVICE_3013 BETWEEN TO_DATE('2013-10','YYYY-MM')
AND TO_DATE('2014-03','YYYY-MM');
select trunc(date_of_service_3013,'MM') "Date"
, sum(count(case when regexp_like(IS_CONCAT, '1234|5678|etc') then user end))
over (order by trunc(date_of_service_3013, 'mm')
range between interval '3' month preceding
and current row) recip
from your_table
group by trunc(date_of_service_3013,'MM')
where DATE_OF_SERVICE_3013 BETWEEN TO_DATE('2013-10','YYYY-MM')
AND TO_DATE('2014-03','YYYY-MM');
这里,根据GROUPBY子句,聚合计数按月计算,然后使用分析总和将这些计数相加
关于这两种解决方案,where条款将阻止统计2013-10年之前的任何记录。如果您想在计数中包括2013-10年之前的记录,但只输出2013-10至2014-03年,则需要在子功能查询块中使用上述两个查询中的任意一个,将t1作为(…)
子功能查询块,并适当调整开始日期,分两个阶段执行:
with t1 as (
select distinct trunc(date_of_service_3013,'MM') "Date"
, count(case when regexp_like(IS_CONCAT, '1234|5678|etc') then user end)
over (order by trunc(date_of_service_3013, 'mm')
range between interval '3' month preceding
and current row) recip
from your_table
where DATE_OF_SERVICE_3013 BETWEEN TO_DATE('2013-07','YYYY-MM')
AND TO_DATE('2014-03','YYYY-MM')
)
select * from t1 where "Date" >= TO_DATE('2013-10','YYYY-MM');
提供一些样本数据和预期输出,我们将尽力提供帮助。样本数据将在滚动月份汇总。因此,用户列将是X(其中X=在过去三个月内拥有IS_代码的用户),看起来您几乎从不接受基于您之前问题的任何答案。此外,这没有任何意义,请提供样本数据(解释您的情况),以帮助其他人了解您的问题。祝你好运