sql - 根据 ID 创建新的 Event_ID,并在日期列上有滑动窗口
问题描述
想象一下我有一张像
ID | 日期 |
---|---|
1 | 2021-01-01 |
1 | 2021-01-05 |
1 | 2021-01-17 |
1 | 2021-02-01 |
1 | 2021-02-18 |
1 | 2021-02-28 |
1 | 2021-03-30 |
2 | 2021-01-01 |
2 | 2021-01-14 |
2 | 2021-02-15 |
我想选择此表上的所有数据,但要创建一个具有新 Event_ID 的新列。事件定义为在 15 天的时间范围内具有相同 ID 的所有行。问题是我希望时间框架移动 - 就像前 3 行一样:第 2 行在第 1 行的 15 天内(因此它们属于同一事件)。第 3 行在第 2 行的 15 天内(但距离第 1 行更远),但我希望将其添加到与以前相同的事件中。(注意:表格没有像示例中那样排序,只是为了方便)。
输出应该是
ID | 日期 | 事件 ID |
---|---|---|
1 | 2021-01-01 | 1 |
1 | 2021-01-05 | 1 |
1 | 2021-01-17 | 1 |
1 | 2021-02-01 | 1 |
1 | 2021-02-18 | 2 |
1 | 2021-02-28 | 2 |
1 | 2021-03-30 | 3 |
2 | 2021-01-01 | 4 |
2 | 2021-01-14 | 4 |
2 | 2021-02-15 | 5 |
我也可以在 R 中使用 data.table 来完成(取决于效率/性能)
解决方案
一个r
解决方案可能是使用来自的dplyr
方法和rleid
功能data.table
library(dplyr)
library(data.table)
df %>% group_by(ID) %>%
mutate(Date = as.Date(Date)) %>% #mutating Date column as Date
arrange(ID, Date) %>% #arranging the rows in order
mutate(Event = if_else(is.na(Date - lag(Date)), Date - Date, Date - lag(Date)),
Event = paste(ID, cumsum(if_else(Event > 15, 1, 0)), sep = "_")) %>%
ungroup() %>% #since the event numbers are not to be created group-wise
mutate(Event = rleid(Event))
# A tibble: 9 x 3
ID Date Event
<int> <date> <int>
1 1 2021-01-01 1
2 1 2021-01-05 1
3 1 2021-01-17 1
4 1 2021-02-15 2
5 1 2021-02-28 2
6 1 2021-03-30 3
7 2 2021-01-01 4
8 2 2021-01-14 4
9 2 2021-02-15 5
推荐阅读
- javascript - 为什么 fetch 向 heroku 上的 localhost 发送请求?
- python - 如何在 docker FROM python:3.6 中使用 apt install
- excel - Microsoft Excel - 如果您制定了适用于特定选择的新条件格式规则,如何在每张工作表上应用相同的规则?
- sharepoint - 通过 Power Automate 发送电子邮件
- kubernetes - 由于 efs 驱动程序问题,Jenkins 应用程序未启动
- google-apps-script - 取消保护错误消息时:目标范围和源范围必须在同一个电子表格上
- ios - SwiftUI - 显示一次后从一开始就为文本设置动画
- maven - 为 Gradle IntelliJ 插件项目添加存储库插件
- ubuntu - 如何在 ubuntu 20.04 焦点上下载 dotnet-sdk-2.2?
- express - 为什么某些 HTTP 标头需要在 express 中明确允许?