我有一列A
,我想根据列B
和来增加或减少C
。
逻辑是这样的:
- 如果
lag(A) = 0
且如果B
= 1 则A=1
- 如果
lag(A) = 1
且如果C
= 1 则A=0
- 来自
lag(A)
ordering byD
我不知道如何在 DuckDB 中实现此逻辑。我认为问题在于这A
取决于前一个值。
select
unnest(array_agg(row(B, C) order by D)) as list1
from
my_table
我认为非嵌套版本一定有某种用途list1
,我认为list_reduce
可能有用,但我搞不清楚如何解决。另一个想法是递归 CTE 可能有用。但我找不到解决方案。
也许在 DuckDB 中这是不可能的,我需要使用列表 UDF。
如果在 SQL 的任何其他变体中也可行,那么我也很想听到答案。
示例数据
B C A D
1 0 0 0 1
2 1 0 1 2
3 0 0 1 3
4 1 0 1 4
5 0 1 0 5
6 1 0 1 6
7 1 0 1 7
8 0 1 0 8
9 0 0 0 9
10 0 1 0 10
R 代码生成数据
fn = function(b, c) {
l = length(b)
A = vector(mode="integer", l)
A[1] = 0
for (i in 2:l) {
A[i]= A[i-1]
if((b[i] == 1) & (A[i-1] == 0)) {
A[i] = 1
} else if ((c[i] == 1) & (A[i-1] == 1)) {
A[i] = 0
}
}
A
}
d = data.frame(
B = c(0, 1, 0, 1, 0, 1, 1, 0, 0, 0),
C = c(0, 0, 0, 0, 1, 0, 0, 1, 0, 1)
) %>% dplyr::mutate(
A = fn(B, C)
) %>%
mutate(D = row_number())
d