困难的MySQL查询 - 获取日期之间的最大差异

时间:2014-01-20 17:13:15

标签: mysql

我有一个以下形式的MySQL表

account_id | call_date
1            2013-06-07
1            2013-06-09  
1            2013-06-21
2            2012-05-01
2            2012-05-02
2            2012-05-06

我想写一个MySQL查询,它将获得每个account_id的call_date中连续日期之间的最大差异(以天为单位)。因此,对于上面的示例,此查询的结果将是

account_id | max_diff
1            12
2            4

我不知道该怎么做。这甚至可以在MySQL查询中完成吗?

我可以datediff(max(call_date),min(call_date)),但这会忽略第一个和最后一个通话日期之间的日期。我需要一些方法在每个account_id的每个连续call_date之间获取datediff(),然后找到最大值。

5 个答案:

答案 0 :(得分:3)

我确信fp的答案会更快,但只是为了好玩......

SELECT account_id
     , MAX(diff) max_diff
  FROM 
     ( SELECT x.account_id
            , DATEDIFF(MIN(y.call_date),x.call_date) diff
         FROM my_table x 
         JOIN my_table y 
           ON y.account_id = x.account_id 
          AND y.call_date > x.call_date 
        GROUP 
           BY x.account_id
            , x.call_date
     ) z
 GROUP
    BY account_id;

答案 1 :(得分:1)

CREATE TABLE t
    (`account_id` int, `call_date` date)
;

INSERT INTO t
    (`account_id`, `call_date`)
VALUES
    (1, '2013-06-07'),
    (1, '2013-06-09'),
    (1, '2013-06-21'),
    (2, '2012-05-01'),
    (2, '2012-05-02'),
    (2, '2012-05-06')
;

select account_id, max(diff) from (
select
account_id,
timestampdiff(day, coalesce(@prev, call_date), call_date) diff,
@prev := call_date
from
t
, (select @prev:=null) v
order by account_id, call_date
) sq 
group by account_id

| ACCOUNT_ID | MAX(DIFF) |
|------------|-----------|
|          1 |        12 |
|          2 |         4 |

答案 2 :(得分:0)

SELECT a1.account_id , max(a1.call_date - a2.call_date)
FROM account a2, account a1
WHERE a1.account_id = a2.account_id
AND a1.call_date > a2.call_date
AND NOT EXISTS
    (SELECT 1 FROM account a3 WHERE a1.call_date > a3.call_date AND a2.call_date < a3.call_date)
GROUP BY a1.account_id

给出了:

ACCOUNT_ID  MAX(A1.CALL_DATE - A2.CALL_DATE)
1           12
2           4

答案 3 :(得分:0)

如果您在account_id, call_date上有索引,那么您可以在没有变量的情况下更有效地执行此操作:

select account_id, max(call_date - prev_call_date) as diff
from (select t.*,
             (select t2.call_date
              from table t2
              where t2.account_id = t.account_id and t2.call_date < t.call_date
              order by t2.call_date desc
              limit 1
             ) as prev_call_date
      from table t
     ) t
group by account_id;

答案 4 :(得分:0)

仅出于教育目的,请使用JOIN

SELECT t1.account_id,
  MAX(DATEDIFF(t2.call_date, t1.call_date)) AS max_diff
FROM t t1
LEFT JOIN t t2
ON t2.account_id = t1.account_id
  AND t2.call_date > t1.call_date
LEFT JOIN t t3
ON t3.account_id = t1.account_id
  AND t3.call_date > t1.call_date
  AND t3.call_date < t2.call_date
WHERE t3.account_id IS NULL
GROUP BY t1.account_id

由于您未指定,因此对于只有1次通话的帐户,此max_diff显示NULL