Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
如何找到客户份额;流出;每个月?(SQLite或Oracle)_Sql_Oracle_Sqlite_Datetime_Count - Fatal编程技术网

如何找到客户份额;流出;每个月?(SQLite或Oracle)

如何找到客户份额;流出;每个月?(SQLite或Oracle),sql,oracle,sqlite,datetime,count,Sql,Oracle,Sqlite,Datetime,Count,客户表包含银行客户的每月快照, 在给定月份进行过任何交易的人员。属性:每月报告 和客户id。我们假设客户在N月从银行“流出”,如果在N月 它在N+1、N+2、N+3个月内处于活动状态(出现在客户表中),在N+1、N+2、N+3个月内处于非活动状态 如何找到每月“流出”的客户份额 表如下所示: report_month client_id 2020-01-01 0023 2020-03-01 0125 …您可以使用窗口函数和窗口框架来实现这一点。在标准SQL中,这看起来像:

客户表包含银行客户的每月快照, 在给定月份进行过任何交易的人员。属性:每月报告 和客户id。我们假设客户在N月从银行“流出”,如果在N月 它在N+1、N+2、N+3个月内处于活动状态(出现在客户表中),在N+1、N+2、N+3个月内处于非活动状态

如何找到每月“流出”的客户份额

表如下所示:

report_month   client_id
2020-01-01     0023
2020-03-01     0125

您可以使用窗口函数和窗口框架来实现这一点。在标准SQL中,这看起来像:

select report_month, sum(case when cnt = 0 then 1 else 0 end) as outflow
from (
    select t.*,
        count(*) over(
            partition by client_id 
            order by report_month
            range between interval '1' month following and interval '3' month following
        ) cnt
    from mytable t
) t
group by report_month
这假设
report\u month
是类似日期的数据类型,每个客户每个
report\u month
都有0或1条记录。如果客户每月出现一次以上,您可以将外部条件
sum()
更改为:

count(distinct case when cnt = 0 then client_id end) as outflow

在SQLite中,数据算术支持较差,这有点复杂。如果你能接受一个月周期的近似值,你可以这样做:

select report_month, sum(case when cnt = 0 then 1 else 0 end) as outflow
from (
    select t.*,
        count(*) over(
            partition by client_id 
            order by julianday(report_month)
            range between 28 following and 92 following
        ) cnt
    from mytable t
) t
group by report_month

请用您正在运行的数据库标记您的问题:mysql、oracle、sqlserver…?是的,报告的月份是日期,客户出现一次。但在这段代码中,我得到了以下错误:“1”附近:语法错误。我试了一下sqlite@GreenMr:您正在运行哪个版本的SQLite?上面的代码将很高兴在Oracle上运行,您也在question.SQLite 3.29中标记并提到了Oracle。很抱歉,我认为它们有相同的函数=(@GreenMr:这就是为什么您应该总是只标记一个数据库,而不是更多…请参阅我的编辑以获得SQLite的替代方案。很抱歉,这个问题,但在SQLite代码中28和92是什么意思?julianday将数据格式化为int,如2458239.5