通常我会在代码本身中执行此操作,但我很好奇是否可以在TSQL中有效地完成此操作.
Table 1 Date - Value
Table 2 Date - Discount
表1包含每天的条目.表2仅在折扣更改时包含条目.在输入新折扣之前,应用于某个值的折扣被视为有效.
示例数据:
Table 1 1/26/2010 - 10 1/25/2010 - 9 1/24/2010 - 8 1/24/2010 - 9 1/23/2010 - 7 1/22/2010 - 10 1/21/2010 - 11
Table 2 1/26/2010 - 2 1/23/2010 - 1 1/20/2010 - 0
我需要返回的是以下内容: T1 Date - T1 Value - T2 Discount
示例数据:
1/26/2010 - 10 - 2 1/25/2010 - 9 - 1 1/24/2010 - 8 - 1 1/24/2010 - 9 - 1 1/23/2010 - 7 …
我正在分析由几个环境变量组成的复杂数据集中的时间模式以及来自各种动物物种的活动数据.这些数据已通过多个实验设置收集,每个设置的数据每分钟存储一次.该项目已经运行了几年,所以我的数据集相当大.
我的一个数据集的前几行看起来像这样:
> head(setup_01)
DateTime Film_number unused PIR Wheel Temperature LightOld LightDay LightNight LightUV IDnumbers error mouse shrew vole rat frog rest extra_info odour
1 2015-03-10 12:27:10 x 0 0 13.40 1471.34 -0.97 1331.29 700.42 no error 0 0 0 0 0 0 1
2 2015-03-10 12:28:10 x 0 0 13.43 1471.38 -1.07 1291.11 731.32 no error 0 0 0 0 0 0 1
3 2015-03-10 12:29:10 x 0 0 13.31 1471.24 -1.08 1368.57 1016.02 no error 0 0 0 …Run Code Online (Sandbox Code Playgroud) 从 SO 上的其他地方窃取一个虚拟示例(在确切日期加入 data.table,或者如果不是在最近的小于日期的情况下加入)),我希望根据严格更早的第一个日期(Dt1 中的日期)加入两个表比第二个日期(Dt2 中的日期)。
还关闭了 DataCombine 解决方案“幻灯片”功能中的“警告”消息,因为它可能不公平地减慢了 mtotos 解决方案的速度。
library(data.table)
Dt1 <- read.table(text="
date x
1/26/2010, 10
1/25/2010, 9
1/24/2010, 9
1/22/2010, 7
1/19/2010, 11", header=TRUE, stringsAsFactors=FALSE)
Dt2 <- read.table(text="
date
1/26/2010
1/23/2010
1/20/2010", header=TRUE, stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)
加入所需的结果
date x
1/26/2010 - 9 # based on closest observation strictly less than date
1/23/2010 - 7
1/20/2010 - 11
Run Code Online (Sandbox Code Playgroud)
(我保留 data.frame 格式用于输入 mtoto 的解决方案,而 data.table 则用于 jangorecki 的解决方案)。
solution.mtoto = function(Df1, Df2)
{
#Full outer join of …Run Code Online (Sandbox Code Playgroud) r ×3
data.table ×1
datetime ×1
lubridate ×1
r-faq ×1
r-maptools ×1
sql ×1
sql-server ×1
time-series ×1