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,其中包含问题示例中的数据。它完全返回指定的结果。谢谢。我刚刚接受了这个答案。事实上,我有一个后续问题与此代码不适用的边缘案例有关。如果您有时间看一看,我将非常感激: