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
SQL-为每个ID创建时间线(Vertica)_Sql_Date_Datetime_Vertica - Fatal编程技术网

SQL-为每个ID创建时间线(Vertica)

SQL-为每个ID创建时间线(Vertica),sql,date,datetime,vertica,Sql,Date,Datetime,Vertica,我正在处理SQL中的以下问题(使用Vertica): 简而言之——为每个ID创建一个时间线(在一个表中,我有多行,在我的示例中,每个ID有多个订单) 我希望实现的目标——我有一个历史订单日期表,我想计算新客户(过去一个月内的第一个订单)、活跃客户(过去1-3个月内超过1个订单)、被动客户(过去3-6个月内没有订单)和非活跃客户(过去6个月内没有订单)的费率 到目前为止,我已经采取了哪些步骤——我能够构建一个类似于以下示例的表格: CustomerID Current order date T

我正在处理SQL中的以下问题(使用Vertica):

简而言之——为每个ID创建一个时间线(在一个表中,我有多行,在我的示例中,每个ID有多个订单)

我希望实现的目标——我有一个历史订单日期表,我想计算新客户(过去一个月内的第一个订单)、活跃客户(过去1-3个月内超过1个订单)、被动客户(过去3-6个月内没有订单)和非活跃客户(过去6个月内没有订单)的费率

到目前为止,我已经采取了哪些步骤——我能够构建一个类似于以下示例的表格:

CustomerID  Current order date  Time between current/previous order First order date (all-time) 
001         2015-04-30 12:06:58 (null)                              2015-04-30 12:06:58
001         2015-09-24 17:30:59 147 05:24:01                        2015-04-30 12:06:58
001         2016-02-11 13:21:10 139 19:50:11                        2015-04-30 12:06:58
002         2015-10-21 10:38:29 (null)                              2015-10-21 10:38:29
003         2015-05-22 12:13:01 (null)                              2015-05-22 12:13:01
003         2015-07-09 01:04:51 47 12:51:50                         2015-05-22 12:13:01
003         2015-10-23 00:23:48 105 23:18:57                        2015-05-22 12:13:01
一点直觉:客户001下了三份订单,而第二份订单是在第一份订单后147天。客户002总共只下了一个订单

我认为接下来的步骤应该是什么——我想知道每个日期(也就是某个用户没有下订单的日期),对于每个CustomerID,自他/她上次订单以来有多长时间了。这意味着我将为每个CustomerID创建某种时间线。在上述示例中,我将获得每个CustomerID的287行(2015年5月1日至2016年2月11日之间的天数,即此表的时间跨度)我在解决上一步时遇到困难。执行此步骤后,我想创建一个字段,显示每个日期的上一个订单日期、上一个订单日期和当前日期之间的时间段,以及某人在当前日期的状态。对于前面介绍的示例,这看起来像这样:

CustomerID Last order date     Current date        Time between current date /last order State
001        2015-04-30 12:06:58 2015-05-01 00:00:00 0 00:00:00                            New
...
001        2015-04-30 12:06:58 2015-06-30 00:00:00 60 11:53:02                           Active
...
001        2015-09-24 17:30:59 2016-02-01 00:00:00 129 11:53:02                          Passive
...

...
002        2015-10-21 17:30:59 2015-10-22 00:00:00 0 06:29:01                            New
...
002        2015-10-21 17:30:59 2015-11-30 00:00:00 39 06:29:01                           Active
...

...
003        2015-05-22 12:13:01 2015-06-23 00:00:00 31 11:46:59                           Active
...
003        2015-07-09 01:04:51 2015-10-22 00:00:00 105 11:46:59                          Inactive
...    
SQL> select * from ord order by custid, ord_date ;
 custid |      ord_date       
--------+---------------------
      1 | 2015-04-30 12:06:58
      1 | 2015-09-24 17:30:59
      1 | 2016-02-11 13:21:10
      2 | 2015-10-21 10:38:29
      3 | 2015-05-22 12:13:01
      3 | 2015-07-09 01:04:51
      3 | 2015-10-23 00:23:48
(7 rows)
   custid | status_dt  |    last_order_dt    | status  
  --------+------------+---------------------+---------
        1 | 2015-04-30 | 2015-04-30 12:06:58 | New
        1 | 2015-05-01 | 2015-04-30 12:06:58 | New
        1 | 2015-05-02 | 2015-04-30 12:06:58 | New
        ...
        1 | 2015-05-29 | 2015-04-30 12:06:58 | New
        1 | 2015-05-30 | 2015-04-30 12:06:58 | Active
        1 | 2015-05-31 | 2015-04-30 12:06:58 | Active
        ...
        etc.
在点上应该有所有的中间日期,但为了空间起见,我把它们从表中漏掉了

当我知道每个日期每个客户的状态(主动/被动/非主动)时,我的计划是按日期对状态和组进行求和,这将给出新客户、主动客户、被动客户和非主动客户的总和。从这里开始,我可以很容易地计算出每个日期的利率

有谁知道我怎样才能完成这项任务

注意——如果有人对如何实现上述目标有其他想法(使用与我设想的方法相比的其他方法),请告诉我

编辑

假设您从如下表开始:

CustomerID Last order date     Current date        Time between current date /last order State
001        2015-04-30 12:06:58 2015-05-01 00:00:00 0 00:00:00                            New
...
001        2015-04-30 12:06:58 2015-06-30 00:00:00 60 11:53:02                           Active
...
001        2015-09-24 17:30:59 2016-02-01 00:00:00 129 11:53:02                          Passive
...

...
002        2015-10-21 17:30:59 2015-10-22 00:00:00 0 06:29:01                            New
...
002        2015-10-21 17:30:59 2015-11-30 00:00:00 39 06:29:01                           Active
...

...
003        2015-05-22 12:13:01 2015-06-23 00:00:00 31 11:46:59                           Active
...
003        2015-07-09 01:04:51 2015-10-22 00:00:00 105 11:46:59                          Inactive
...    
SQL> select * from ord order by custid, ord_date ;
 custid |      ord_date       
--------+---------------------
      1 | 2015-04-30 12:06:58
      1 | 2015-09-24 17:30:59
      1 | 2016-02-11 13:21:10
      2 | 2015-10-21 10:38:29
      3 | 2015-05-22 12:13:01
      3 | 2015-07-09 01:04:51
      3 | 2015-10-23 00:23:48
(7 rows)
   custid | status_dt  |    last_order_dt    | status  
  --------+------------+---------------------+---------
        1 | 2015-04-30 | 2015-04-30 12:06:58 | New
        1 | 2015-05-01 | 2015-04-30 12:06:58 | New
        1 | 2015-05-02 | 2015-04-30 12:06:58 | New
        ...
        1 | 2015-05-29 | 2015-04-30 12:06:58 | New
        1 | 2015-05-30 | 2015-04-30 12:06:58 | Active
        1 | 2015-05-31 | 2015-04-30 12:06:58 | Active
        ...
        etc.
您可以使用Vertica的Timeseries分析函数TS_FIRST_VALUE()、TS_LAST_VALUE()来填补空白,并将上次订单日期插值到当前日期:

然后,您只需将其与Vertica的TimeSeries连接起来,该TimeSeries是从同一个表生成的,时间间隔为一天,从每位客户第一次下订单到现在(当前_日期)的第一天开始:


你的问题毫无意义。你在努力实现你的“目标”吗?你想得到“我想要的”吗?我建议你删除这个问题。然后用示例数据、所需结果和对所问内容的明确说明询问另一个问题。如果您有一个包含两列(CustomerId和OrderDate)的表,则很容易生成查询:CustomerId、FirstOrderDate、LastOrderDate、CurrentDate和Status(New/Active/Inactive)。这就是你要找的吗?客户状态(基于CurrentDate-LastOrderDate)将每天更改。。。好吗?@GordonLinoff我已经编辑了我的文章,并试图澄清我的标题和文章中给出的例子。你能告诉我我的问题现在是否清楚了吗?@mauro我确实想要你描述的东西。现在,我为每个CustomerId设置了一行或多行,每行一行都有一个OrderDate。我想知道从我的数据库中第一次下订单到今天每天的所有价格。客户状态确实每天都在根据特定CustomerId订购产品的CurrentDate和LastOrderDate发生变化。有什么想法吗?@user5818317假设一位客户确实在一年前下了订单,您希望了解该客户的状态“从第一次下订单到今天的每一天”,然后。。。您将在输出中获得365列。而且。。。对于一个月前发送订单的另一位客户,列数将仅为30…感谢您的回答!还有两个小“问题”没有完全解决。首先,您的查询只允许客户在最终订单后至少3个月后变为被动/非主动。这意味着,如果客户在1月1日下了第一个订单,但在接下来的6个月内没有订单(下一个订单在7月1日),他在整个6个月内仍被视为“主动”,而在4月1日之后,该客户应被视为“被动”,因为3个月过去了,他从那时起就没有订购过。从7月1日起,他的状态应改为“活跃”。第二个尚未解决的问题是,一个全新的客户在第一次下订单一个月后开始活跃之前,应首先被视为“新客户”。如果他将来下另一个订单,那么他应该只获得“活动”状态,而不是“新”状态。@TomasG我明白你的意思。你不会相信,但这实际上简化了我的SQL。正如您所看到的,我使用框架子句
在无界的前一行和无界的后一行之间按CUSTID对FIRST/LAST_值进行分区,并按ORD_日期排序,因为我最初认为您希望将所有内容都引用到最后一个订单日期。现在,通过您的进一步解释,(这对我来说很有意义),我将删除这个framing子句,并保留order子句,以便WindowFunctions在默认情况下使用“无界前一行和当前行之间的行”。这就是你需要的。。。