繁体   English   中英

MySQL每天累计的记录计数

[英]MySQL Counting Records Cumulative per Day

我有一个看起来像这样的表:

S_ID   |   DATE
1        2016-01-01 
1        2016-01-02
1        2016-01-02
1        2016-01-05
1        2016-01-05
2        2017-01-02
2        2017-01-04
2        2017-01-04
2        2017-01-04
2        2017-01-04
2        2017-01-05

我正在尝试在单个查询中得到以下结果(及时添加记录)

DATE        |  S_ID 1 |  S_ID 2 
2016-01-01  |    1    |   0
2016-01-02  |    3    |   1
2016-01-03  |    3    |   1
2016-01-04  |    3    |   5
2016-01-05  |    5    |   6

有什么建议么?

尝试使用日期和条件总和与用户变量一起使用,以获取累积总和。

Select date, 
    @s1 := @s1 + s_id_1 s_id_1,
    @s2 := @s2 + s_id_2 s_id_2
From (select 
    date, 
    sum(s_id = 1) s_id_1,
    sum(s_id = 2) s_id_2
from your_table
group by date
Order by date) t cross join (select @s1 := 0, @s2 :=0 ) t2;

它使用以下事实:在mysql中true为1,false为0

你最好用

select 
    t.s_ID, 
    t.`date`,
    (SELECT SUM(1) FROM table x WHERE x.`date` <= t.`date` AND x.S_ID = t.S_ID) AS cumulative_sum
from table t
group by s_ID,`date`;

这不会提供您想要的结果,而是结果的一种形式,它与用户数量无关,而信息却保持不变:

s_ID | DATE      | cumulative_sum
1      2016-01-01  1 
1      2016-01-02  3
1      2016-01-05  5
2      2016-01-02  1
2      2016-01-04  5
2      2016-01-05  6

(如果没有ID /日期对的条目,则该天的计数没有变化)

您可以使用PREPARED语句到达此位置。 第一个查询将生成表中所有s_id的查询。 您只需要将YOYOURTABLE更改为表名:请参见示例

    CONCAT('SELECT `date`,'
            ,GROUP_CONCAT(f1)
            ,' FROM YOURTABLE GROUP BY DATE')
    INTO @myquery
    FROM (
    SELECT DISTINCT CONCAT('sum(s_id = ',s_id,') AS sid_',s_id) AS f1
    FROM yourtable
    ) tab1;

-- ONLY for Test to verify the Query
SELECT @myquery;


PREPARE test FROM @myquery;
EXECUTE test;
DEALLOCATE PREPARE test;

样品

mysql> SELECT * FROM yourtable;
+------+------------+
| s_id | date       |
+------+------------+
|    1 | 2016-01-01 |
|    1 | 2017-02-02 |
|    2 | 2017-01-05 |
|    4 | 2016-03-04 |
|    7 | 2016-12-12 |
+------+------------+
5 rows in set (0,01 sec)

mysql> SELECT
    ->     CONCAT('SELECT `date`,'
    ->             ,GROUP_CONCAT(f1)
    ->             ,' FROM YOURTABLE GROUP BY DATE')
    ->     INTO @myquery
    ->     FROM (
    ->     SELECT DISTINCT CONCAT('sum(s_id = ',s_id,') AS sid_',s_id) AS f1
    ->     FROM yourtable
    ->     ) tab1;
Query OK, 1 row affected (0,01 sec)

mysql> SELECT @myquery;
+----------------------------------------------------------------------------------------------------------------------------------------+
| @myquery                                                                                                                               |
+----------------------------------------------------------------------------------------------------------------------------------------+
| SELECT `date`,sum(s_id = 1) AS sid_1,sum(s_id = 2) AS sid_2,sum(s_id = 4) AS sid_4,sum(s_id = 7) AS sid_7 FROM YOURTABLE GROUP BY DATE |
+----------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0,00 sec)

mysql> PREPARE test FROM @myquery;
Query OK, 0 rows affected (0,00 sec)

mysql> EXECUTE test;
+------------+-------+-------+-------+-------+
| date       | sid_1 | sid_2 | sid_4 | sid_7 |
+------------+-------+-------+-------+-------+
| 2016-01-01 |     1 |     0 |     0 |     0 |
| 2016-03-04 |     0 |     0 |     1 |     0 |
| 2016-12-12 |     0 |     0 |     0 |     1 |
| 2017-01-05 |     0 |     1 |     0 |     0 |
| 2017-02-02 |     1 |     0 |     0 |     0 |
+------------+-------+-------+-------+-------+
5 rows in set (0,00 sec)

mysql> DEALLOCATE PREPARE test;
Query OK, 0 rows affected (0,00 sec)

mysql>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM