使用 (my)sql 计算每个日期的差异

calculate dfference per date with (my)sql

我有一个 (mysql) table 看起来像这样:

|date      |status
|2017-07-10|done
|2017-07-10|new 
|2017-07-11|done
|2017-07-11|done 
|2017-07-12|done
|2017-07-12|done 
|2017-07-12|new 

现在我想要完成状态(或所有状态)的每个日期的计数差异所以在 2017-07-11 我得到一个,因为比前一天多了一个完成状态,并且等等。

|date      |cnt
|2017-07-11|1
|2017-07-12|0

我已经有一个 SQL,它给出了一个输入日期的结果:

SELECT '2017-07-11' as d2,
       (SELECT count(*) as cnt 
          FROM table 
         WHERE status = 'done' 
           AND date > DATE_ADD(d2, INTERVAL 1 DAY) 
           AND date < DATE_ADD(d2, INTERVAL 2 DAY)) - 
       (SELECT count(*) as cnt 
          FROM table 
         WHERE status = 'done' 
           AND date > d2 
           AND date < DATE_ADD(d2, INTERVAL 1 DAY)) as cnt;

但这只适用于 d2 的静态日期,不适用于子查询。谁能帮忙?如果可能的话,我也会为 postgres 采取一个解决方案。

SELECT cur.dt,
       nxt.cnt - cur.cnt
  FROM (SELECT dt,
               COUNT(stat) cnt
          FROM tab
         WHERE stat = 'done'
         GROUP BY dt
       ) nxt
  JOIN 
       (SELECT (dt + 1) dt,
               COUNT(stat) cnt
          FROM tab
         WHERE stat = 'done'
         GROUP BY dt
       ) cur
    ON nxt.dt = cur.dt

结果

dt        nxt.cnt - cur.cnt
20170711  1
20170712  0