sql - 等同于带data.table的sql笛卡尔查询

标签 sql r data.table

有没有办法在 data.table 中获取与以下 SQL 查询等效的内容?

create C as select * from R,P where 
P.x between R.min_x and R.max_x and P.var2 < R.col3

我的问题是我不能计算 R,P 的笛卡尔积,因为 R 会崩溃,我对任何技术都很满意(即使它是分几步...)

典型大小为 R 1K 行,P 3M 行

编辑:

library(data.table)
R = data.table(min_x=c(.6,.4,.01,.8),max_x=c(.7,.51,.05,.95),col3=c(.6,.4,1.2,.6))
P = data.table(x=seq(.1,.9,.1),var2=c(1,.4,.3,.2,0,.5,.65,.7,0))
setkey(P, x)
setkey(R,min_x,max_x) #and max_x is always > min_x

#R
#   min_x max_x col3
#1:  0.01  0.05  1.2
#2:  0.40  0.51  0.4
#3:  0.60  0.70  0.6
#4:  0.80  0.95  0.6

#B
#      x var2
#1:  0.1 1.00 => var1 not in any [col1,col2]
#2:  0.2 0.40 => same
#3:  0.3 0.30 => same
#4:  0.4 0.20 => .4 in [.4,.51] but .2 < .4 so NO
#5:  0.5    0 => same 
#6:  0.6 0.50 => .6 in [.6, .7] but .5 < .6 so NO
#7:  0.7 0.65 => .6 in [.6, .7] AND .65 > .6 => SELECTED
#8:  0.8 0.70 => YES
#9:  0.9    0 => NO

如此预期的结果

#  min_x max_x  col3    x var2
#1: 0.60  0.70  0.6  0.70 0.65 
#2: 0.80  0.95  0.6  0.80 0.70

最佳答案

当此 FR 实现时(及其链接可能有用):

FR#203 Allow 2 column to specify range in i instead of %between%

可能是:

setkey(B, var1, var2)
B[A[,list(.(col1,col2),.(-Inf,col3))], j]

如果这听起来不错?您可能希望指定一个 j,它将按组(每行 i)运行,以在内存中保存潜在的笛卡尔展开。但是如果你真的想要返回大表,可以设置 allow.cartesian 标志:

B[A[,list(.(col1,col2),.(-Inf,col3))], allow.cartesian=TRUE]

这当然不能马上完成,所以这只是一个探索性的答案。

关于sql - 等同于带data.table的sql笛卡尔查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15644075/

相关文章:

mysql - 将两个 SQL 查询与多个表连接起来

r - tm 包中不再支持 Dictionary()。如何修改代码?

mysql - 如果删除了两个外键,则删除表条目

mysql - 如何通过每天和每周定义的层次结构汇总事件类型(使用 SQL 或 ETL)

r - 使用正则表达式更改大小写时出现意外结果

r - Max by Group with Condition for a data.table

r - 有多个匹配项时加入数据框并选择随机行

r - 使用 fread 和 awk 子集许多 .dat.gz 文件

r - 根据 ID 将值复制到其他 NA 单元

sql - 找出哪些记录对的位置可以在一组组合记录中安全地切换