Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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
Mysql 提取重新加入的时间_Mysql_Sql_R_Dplyr - Fatal编程技术网

Mysql 提取重新加入的时间

Mysql 提取重新加入的时间,mysql,sql,r,dplyr,Mysql,Sql,R,Dplyr,我有一个结构如下的表格,其中包含关于俱乐部成员资格的信息 id start end cancelled 1 2020-01-01 2020-12-31 2021-01-10 1 2021-02-01 2022-01-31 NA 2 2020-01-01 2020-12-31 NA 3 2020-01-01 2020-06-30 2020-07-01 3 2020-07-10 2021-01-09 2021-01-3

我有一个结构如下的表格,其中包含关于俱乐部成员资格的信息

id  start       end          cancelled
1   2020-01-01  2020-12-31   2021-01-10
1   2021-02-01  2022-01-31   NA
2   2020-01-01  2020-12-31   NA
3   2020-01-01  2020-06-30   2020-07-01
3   2020-07-10  2021-01-09   2021-01-31
3   2021-02-02  2021-08-01   NA
我对后来重新加入的成员感兴趣。对于上述数据,在整个期间,
id1
这样做了一次,
id2
没有,而
id3
这样做了两次

F每次发生这种情况,他们的会员资格结束和重新加入之间的时间是多少?对于上述数据,这将是:

id  rejoin_date time_to_rejoin
1   2021-01-31  22 days 
3   2020-07-10  9 days
3   2021-02-02  2 days
对于R:

structure(list(id = c(1, 1, 2, 3, 3, 3), start = c("2020-01-01", 
"2021-02-01", "2020-01-01", "2020-01-01", "2020-07-10", "2021-02-02"
), end = c("2020-12-31", "2022-01-31", "2020-12-31", "2020-06-30", 
"2021-01-09", "2021-08-01"), cancelled = c("2021-01-10", NA, 
NA, "2020-07-01", "2021-01-31", NA)), class = "data.frame", row.names = c(NA, 
-6L))
对于SQL:

CREATE TABLE IF NOT EXISTS `dt` (
  `id` int(6) unsigned NOT NULL,
  `start` TIMESTAMP,
  `end` TIMESTAMP,
  `cancelled` TIMESTAMP NULL
) DEFAULT CHARSET=utf8;
INSERT INTO `dt` (`id`, `start`, `end`, `cancelled`) VALUES
  ('1', '2020-01-01', '2020-12-31', '2021-01-10'),
  ('2', '2021-02-01', '2022-01-31', NULL ),
  ('2', '2021-01-01', '2020-12-31', NULL ),
  ('3', '2020-01-01', '2020-06-30', '2020-07-01'),
  ('3', '2021-02-10', '2021-01-09', '2021-01-31'),
  ('3', '2021-02-02', '2021-08-01', NULL )

我很乐意回答使用R(最好使用dplyr)或SQL(MySQL)

首先,更改为
Date
类,任何人都不应该尝试计算
字符的日期差异

dat[,-1]%
分组依据(id)%>%
总结(
重新加入日期=开始[-1],
重新加入的时间=as.numeric(开始[-1]-取消[-n()],单位=“天”)
) %>%
解组()
##tibble:3 x 3
#id重新加入\u日期时间\u重新加入
#                   
# 1     1 2021-02-01              22
# 2     3 2020-07-10               9
# 3     3 2021-02-02               2

dat%>%
分组依据(id)%>%
总结(
重新加入日期=开始[-1],
重新加入的时间=as.numeric(开始-延迟(已取消),单位=“天”)[-1]
) %>%
解组()
数据表
库(data.table)

datDT首先,更改为
Date
类,任何人都不应该试图计算
字符的日期差异

dat[,-1]%
分组依据(id)%>%
总结(
重新加入日期=开始[-1],
重新加入的时间=as.numeric(开始[-1]-取消[-n()],单位=“天”)
) %>%
解组()
##tibble:3 x 3
#id重新加入\u日期时间\u重新加入
#                   
# 1     1 2021-02-01              22
# 2     3 2020-07-10               9
# 3     3 2021-02-02               2

dat%>%
分组依据(id)%>%
总结(
重新加入日期=开始[-1],
重新加入的时间=as.numeric(开始-延迟(已取消),单位=“天”)[-1]
) %>%
解组()
数据表
库(data.table)
datDT您可以使用
lag()
然后过滤:

select t.*,
       datediff(start, prev_cancelled) as num_days_since_cancel
from (select t.*,
             lag(cancelled) over (partition by id order by start) as prev_cancelled
      from t
     ) t
where prev_cancelled is not null;
是一个dbfiddle。

您可以使用
lag()
然后过滤:

select t.*,
       datediff(start, prev_cancelled) as num_days_since_cancel
from (select t.*,
             lag(cancelled) over (partition by id order by start) as prev_cancelled
      from t
     ) t
where prev_cancelled is not null;

是一个dbfiddle。

如果是SQL,是什么数据库?为什么3的第二次重新加入日期与您的示例数据不同?@r2evans抱歉,这是一个错误typo@GordonLinoffMySQL请问SQL是什么数据库?为什么3的第二次重新加入日期与您的示例数据不同?@r2evans抱歉,这是一个错误typo@GordonLinoff谢谢你(+1)请您为
dplyr
解决方案添加一点注释,解释
总结
步骤?快速跟进,如果一个成员有超过1个并发未过期的成员,我相信您的
dplyr
会为
生成一行
NA
,这看起来很好,因为我可以用
drop\u na()
删除它。这对你有意义吗?我想,我没有考虑过这种可能性。如果有效,请坚持。谢谢(+1)请您为
dplyr
解决方案添加一点注释,解释
总结
步骤?快速跟进,如果一个成员有超过1个并发未过期的成员,我相信您的
dplyr
会导致
NA
出现一行,这看起来很好,因为我可以用
drop\u na()
删除它。这对你有意义吗?我想,我没有考虑过这种可能性。如果这行得通,就坚持下去。谢谢(+1)这看起来很有希望,但我不能让它毫无错误地工作。您是否可以检查它,与我添加到问题中的SQL创建。我猜子查询应该是来自
而不是
t
@JoeKing的
。我修复了差异的逻辑(日期和上一次取消之间),并添加了一个dbfiddle,其中包含问题示例中的数据。它完全返回指定的结果。谢谢。我刚刚接受了这个答案。事实上,我有一个后续问题与此代码不适用的边缘案例有关。如果你有时间看一看,我会非常感激:谢谢你(+1)这看起来很有希望,但我不能让它正常工作。您是否可以检查它,与我添加到问题中的SQL创建。我猜子查询应该是来自
而不是
t
@JoeKing的
。我修复了差异的逻辑(日期和上一次取消之间),并添加了一个dbfiddle,其中包含问题示例中的数据。它完全返回指定的结果。谢谢。我刚刚接受了这个答案。事实上,我有一个后续问题与此代码不适用的边缘案例有关。如果您有时间看一看,我将非常感激: