Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在一定条件下找出两列中日期之间的最小差异_Sql_R - Fatal编程技术网

Sql 如何在一定条件下找出两列中日期之间的最小差异

Sql 如何在一定条件下找出两列中日期之间的最小差异,sql,r,Sql,R,我在两个不同的日期表中有两列,如下所示 A: response table: key response_date 1 2013/01/01 1 2015/12/01 2 2016/02/01 3 2016/08/01 3 2016/09/01 B: Call table key attempt call_date 1 1 2014/11/20 1 2 2015/09/01 2 3

我在两个不同的日期表中有两列,如下所示

A: response table:
key    response_date 
1      2013/01/01
1      2015/12/01
2      2016/02/01
3      2016/08/01
3      2016/09/01

B: Call table
key  attempt  call_date
1    1        2014/11/20
1    2        2015/09/01
2    3        2016/01/01
2    4        2016/03/01
2    5        2016/10/15
3    6        2016/03/01
3    7        2016/07/01
当调用表中的键与响应表中的键匹配时,每个调用只有一个响应。我想找出回应的时间。响应发生在调用之后,它应该是该调用之后的最新响应。例如,对于键1,2014/11/20和2015/09/01有两个电话,2013/01/01和2015/12/01也有两个不同的响应。2015/12/01是2015/09/01呼叫的响应日期,而不是2014/11/20,因为它更接近2015/09/01呼叫。那么,2013/01/01和time_diff=0的通话没有响应

对于键2,呼叫调度4和5没有响应

对于键3尝试6,我们可以看到键=3的两个响应,但它们更接近调用尝试7。因此,没有尝试6的重复,尝试7的时间_diff=0,时间_diff介于(2016/07/012016/08/01)之间,这是尝试7之后的最新响应

key  attempt  time_diff
1    1        0
1    2        days between(2015/09/01,2015/12/01)
2    3        days between(2016/01/01,2016/02/01)
2    4        0
2    5        0
3    6        0
3    7        days between(2016/07/01,2016/08/01)

sql或R中的任何响应或提示都将不胜感激。

您没有指定sql的方言,因此我为sql Server编写了这篇文章。它可能需要进行一些语法调整,才能在另一个DBMS中工作,但这里有一个大致的想法可以帮助您实现这一点:

SELECT 
    b.[key]         AS  [key],
    b.activity      AS  activity,
    CASE WHEN DATEDIFF(DAY, a.date_A, b.date_B) = c.max_time 
    THEN C.max_time
    ELSE 0 END      
                    AS time_diff
FROM
    b
JOIN
    (
    SELECT 
        b.[key]                                 AS  [key],
        MAX(DATEDIFF(DAY, a.date_A, b.date_B))  AS  max_time
    FROM
        a
    JOIN
        b 
    ON  
        a.[key] =  b.[key]
    GROUP BY 
        b.[key]
    ) AS c
ON
    b.[key] = c.[key]
JOIN
    a
ON
    b.[key] = a.[key]
我不确定我是否理解(也无法再现)你预期结果背后的逻辑

根据您的预期结果符号,这是我对结果的预期

key  activity time_diff
1    1        days between(2014/11/20,2015/12/01)
1    2        days between(2015/09/01,2015/12/01)
2    3        days between(2016/01/01,2016/02/01)
2    4        0
2    5        0
3    6        days between(2016/03/01,2016/08/01)
3    7        days between(2016/07/01,2016/08/01)

也许您可以解释一下,为什么您的示例中的条目
key=1,activity=1
key=3,activity=6
具有
time\u diff=0

希望下面的
R
解决方案有帮助

库(dplyr)
响应\u表$响应\u日期%
变异(日期差异=数值(响应日期-调用日期))%>%
过滤器(日期差异>0)%>%
分组依据(键)%>%
筛选器(其中.min(日期差异)=行数())%>%
解组%>%
变异(time_diff=paste0(“,call_date,”,“,response_date,”))%>%
右键联接(调用表,按=c(“键”,“尝试”))%>%
选择(键、尝试、时间差)%>%
替换(列表(时间差=0'))
输出为:

    key attempt time_diff                                                   
1     1       1 0                                  
2     1       2 days between(2015-09-01,2015-12-01)
3     2       3 days between(2016-01-01,2016-02-01)
4     2       4 0                                  
5     2       5 0                                  
6     3       6 0                                  
7     3       7 days between(2016-07-01,2016-08-01)
样本数据:

response_table <- structure(list(key = c(1L, 1L, 2L, 3L, 3L), response_date = c("2013/01/01", 
"2015/12/01", "2016/02/01", "2016/08/01", "2016/09/01")), .Names = c("key", 
"response_date"), class = "data.frame", row.names = c(NA, -5L
))

call_table <- structure(list(key = c(1L, 1L, 2L, 2L, 2L, 3L, 3L), attempt = 1:7, 
    call_date = c("2014/11/20", "2015/09/01", "2016/01/01", "2016/03/01", 
    "2016/10/15", "2016/03/01", "2016/07/01")), .Names = c("key", 
"attempt", "call_date"), class = "data.frame", row.names = c(NA, 
-7L))

response\u表我不清楚您的预期结果:从第二个数据集中获取
key=1,activity=1
。那么,对于
key=1
,您的第一个数据集中的
date\u A=2015/12/01
date\u B=2014/11/20
之后,那么为什么您的预期结果中有
time\u diff=0
?对于
key=3,activity=6
date\u A=2016/08/01>date\u B=2016/03/01
。为什么此条目的
time\u diff=0
?我也不明白你是怎么合并的。例如,对于
key=1,activity=1
我希望在您的预期结果中有两个条目,因为您有两个
date\u A
条目。为什么只保留一个?对于key=1,activity=1,从日期为2015/12/01的第二个数据集,从第一个数据集我们有2015/12/01和2013/01/01。只有2015/12/01是在日期2014/11/20之后,但关键1的另一个数据是2015/09/01,与日期2014/11/20相比更为近期。所以活动1的时间差为0,活动2的时间差为(2015/09/012015/12/01)和(2015/09/012015/12/01)之间的天,我没有跟踪你。为什么不为键=1、活动=1设置两个条目?您在匹配的
date\u A
中有两次约会。你没有提到任何你丢弃条目的地方。请看下面我的解决方案尝试,它是不完整的,与您想要的还不一致。也许你可以在下面澄清。我已经更新了这个问题。希望这是清楚的,你可以帮助我。谢谢你的帮助。让我在这里再次解释我的问题:在你的result@Sajjad我已经编辑了我的解决方案,试图根据我的理解包含预期结果。也许您可以在这里的评论中澄清这一错误的原因。条目key=1,activity=1有时间_diff=0,因为调用日期为2014/11/20,之后还有另一个调用key=1,时间为2015/09/01,更接近响应日期2015/12/01。因此,2014年11月20日的第一次电话没有回应。再次感谢。顺便说一句,我没看到你的新工作code@Sajjad不,对不起,这对我来说毫无意义。以
key=2,activity=3为例:根据您的推理,这应该会给出
time\u diff=0
,因为
date\u B=2016/03/01
from
key=2,activity=4
更接近
date\u A=2016/02/01
。因此,根据您的规则,
key=2,activity=4将有一个非零条目。但在你预期的结果中,情况并非如此。请您检查一下。@Sajjad PS.我删除了我的解决方案尝试,因为我越来越不确定您在预期结果背后的逻辑。我尝试了您的方法,但它不起作用。我重新审视了这个问题。在每次调用之后,您的方法不考虑最近的响应。就像键1发生的那样,调用1