这里有张桌子
DF <- tibble(
CLIENT = c(1,1,1,2,2,2,3,3,3),
N_DOG = c('N1','N2','N3','N4','N5','N6','N7','N8','N9'),
DT = as.Date(c('01.06.2021','12.07.2021','04.05.2021',
'03.08.2021','21.07.2021','04.01.2022',
'07.04.2021','09.11.2021','08.12.2021'), format = '%d.%m.%Y'),
RANK = c(1,1,2,3,1,1,2,2,3)
)
客户 | N_DOG | DT | 秩 |
---|---|---|---|
一 | N1 | 2021-06-01 | 一 |
一 | N2 | 2021-07-12 | 一 |
一 | N3 | 2021-05-04 | 2 |
2 | N4 | 2021-08-03 | 3 |
2 | N5 | 2021-07-21 | 一 |
2 | N6 | 2022-01-04 | 一 |
3 | N7 | 2021-04-07 | 2 |
3 | N8 | 2021-11-09 | 2 |
3 | N9 | 2021-12-08 | 3 |
您需要根据以下标准为每个客户找到一份合同:
- 查找具有最低等级的合同
- 如果有多个这样的合同,我们选择最后一个。
PS。根据上述条件,输出必须是唯一的客户和 1 个合约
执行
MIN_RANK <- DF %>%
select(CLIENT, RANK) %>%
group_by(CLIENT) %>%
filter(RANK == min(RANK)) %>%
ungroup() %>%
distinct()
MIN_RANK %>%
inner_join(DF, by = c('CLIENT','RANK')) %>%
select(!c(N_DOG,RANK)) %>%
group_by(CLIENT) %>%
filter(DT == max(DT)) %>%
inner_join(DF, by = c('CLIENT','DT'))
决赛
客户 | DT | N_DOG | 秩 |
---|---|---|---|
一 | 2021-07-12 | N2 | 一 |
2 | 2022-01-04 | N6 | 一 |
3 | 2021-11-09 | N8 | 2 |
怎样才能更快地完成这个动作?[可能已经有写功能]
论坛上有一个类似的SQL
使用
data.table
: