Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何获得计数的滚动视图?_Sql_Oracle_To Date - Fatal编程技术网

Sql 如何获得计数的滚动视图?

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

目标是统计从指定日期起三个月内符合标准的任何人。这(介于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|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_代码的用户),看起来您几乎从不接受基于您之前问题的任何答案。此外,这没有任何意义,请提供样本数据(解释您的情况),以帮助其他人了解您的问题。祝你好运