与mysql的累积和

与mysql的累积和,mysql,Mysql,我有以下疑问: set @cumulativeSum := 0; select (@cumulativeSum:= @cumulativeSum + (count(distinct `ce`.URL, `ce`.`IP`))) as `uniqueClicks`, cast(`ce`.`dt` as date) as `createdAt` from (SELECT DISTINCT min((date(CODE_EVENTS.CREATED_AT))) dt, CODE_EVENTS.

我有以下疑问:

set @cumulativeSum := 0;
select
  (@cumulativeSum:= @cumulativeSum + (count(distinct `ce`.URL, `ce`.`IP`))) as `uniqueClicks`,
  cast(`ce`.`dt` as date) as `createdAt`
from (SELECT DISTINCT min((date(CODE_EVENTS.CREATED_AT))) dt, CODE_EVENTS.IP, CODE_EVENTS.URL
      FROM CODE_EVENTS
      GROUP BY CODE_EVENTS.IP, CODE_EVENTS.URL) as ce
      join ATTACHMENT on `ce`.URL = ATTACHMENT.`ID`
where ATTACHMENT.`USER_ID` = 6
group by cast(`ce`.`dt` as date)
  ORDER BY ce.URL;
它几乎可以正常工作,我想有一个结果集的日期和金额的累计总和作为唯一点击,问题是,在我的结果集,它不是加在一起

uniqueClicks createdAt
1            2018-02-01
3            2018-02-03
1            2018-02-04
我想要

uniqueClicks createdAt
1            2018-02-01
4            2018-02-03
5            2018-02-04

我相信您可以获得唯一点击的滚动总和,而无需使用动态SQL:

SELECT
    t1.CREATED_AT,
    (SELECT SUM(t2.uniqueClicks) FROM
     (
         SELECT CREATED_AT, COUNT(DISTINCT IP, URL) uniqueClicks
         FROM CODE_EVENTS
         GROUP BY CREATED_AT
     ) t2
     WHERE t2.CREATED_AT <= t1.CREATED_AT) uniqueClicksRolling
FROM
(
    SELECT DISTINCT CREATED_AT
    FROM CODE_EVENTS
) t1
ORDER BY t1.CREATED_AT;

别名为t2的子查询计算每个给定日期出现在表中的唯一单击次数。IP和URL的不同计数决定了点击次数。然后,我们可以子查询这个中间表,并计算包括当前日期在内的所有日期的点击次数。这本质上是游标式的操作,可以取代会话变量的使用。

这必须在查询中进行吗?这是我会选择的少数几种情况之一:也许用PHP处理这个问题?这不是一个在表CODE_EVENTS中有很多记录的缓慢查询吗?@filemonczyk是的,这是一种N^2方法,性能可能不太好。但是,如果您在相当小的时间范围内使用它,对您来说可能不是问题。如果您需要性能,那么是的,您使用会话变量的方法可能就是这样做的。我刚刚看到了一种简化查询的方法,并继续使用它。我必须准备好表n^2中的大量记录可能会扼杀查询request@filemonczyk事实上,现在我想了更多关于您的问题,您可能希望在插入后使用触发器来连续记录输入的点击。换句话说,您可以动态地维护每天的点击次数。然后,当您进行查询时,您只是在读取一组已经计算过的静态数据。