每天计数(mysql)

时间:2018-07-07 00:31:56

标签: mysql sql

I want get something like this

Mysql数据

(dat_reg)
1.1.2000 
1.1.2000 
1.1.2000
2.1.2000
2.1.2000
3.1.2000

我想得到:

   (dat_reg)  (count)
    1.1.2000 -   3
    2.1.2000 -   5
    3.1.2000 -   6

我尝试过的是这个

SELECT COUNT( * ) as a , DATE_FORMAT( dat_reg, '%d.%m.%Y' ) AS dat 
FROM members 
WHERE (dat_reg > DATE_SUB(NOW() , INTERVAL 5 DAY)) 
GROUP BY DATE_FORMAT(dat_reg, '%d.%m.%Y') 
ORDER BY dat_reg 

但我得到:

 1.1.2000 - 3 | 2.1.2000 - 2 | 3.1.2000 - 1 

一些提示如何为此创建查询?

4 个答案:

答案 0 :(得分:0)

子查询对注册日期小于或等于当前注册日期的行进行计数可以帮助您。

SELECT m2.dat_reg,
       (SELECT count(*)
               FROM members m3
               WHERE m3.dat_reg <= m2.dat_reg) count
       FROM (SELECT DISTINCT m1.dat_reg
                    FROM m1.members
                    WHERE m1.dat_reg > date_sub(now(), INTERVAL 5 DAY)) m2
       ORDER BY m2.dat_reg;

(如果您有几天没有人注册并且不想在结果中留下空白,则需要用表或子查询替换别名为m2的子查询,该表或子查询在各自的范围。)

答案 1 :(得分:0)

我建议在MySQL中使用变量:

SELECT d.*, (@sumc := @sumc + cnt) as running_cnt
FROM (SELECT DATE_FORMAT(dat_reg, '%d.%m.%Y') as dat, COUNT(*) as cnt
      FROM members 
      WHERE dat_reg > DATE_SUB(NOW() , INTERVAL 5 DAY) 
      GROUP BY dat
      ORDER BY dat_reg 
     ) d CROSS JOIN
     (SELECT @sumc := 0) params;

如果要从一开始就进行累加,则需要一个附加的子查询:

SELECT d.*
FROM (SELECT d.*, (@sumc := @sumc + cnt) as running_cnt
      FROM (SELECT DATE_FORMAT(dat_reg, '%d.%m.%Y') as dat, dat_reg, COUNT(*) as cnt
            FROM members 
            GROUP BY dat
            ORDER BY dat_reg 
           ) d CROSS JOIN
           (SELECT @sumc := 0) params
      ) d
WHERE dat_reg > DATE_SUB(NOW() , INTERVAL 5 DAY)

答案 2 :(得分:0)

我相信您可以使用窗口功能来完成工作:

mysql> SELECT employee, sale, date, SUM(sale) OVER (PARTITION by employee ORDER BY date) AS cum_sales FROM sales;
+----------+------+------------+-----------+
| employee | sale | date       | cum_sales |
+----------+------+------------+-----------+
| odin     |  200 | 2017-03-01 |       200 |
| odin     |  300 | 2017-04-01 |       500 |
| odin     |  400 | 2017-05-01 |       900 |
| thor     |  400 | 2017-03-01 |       400 |
| thor     |  300 | 2017-04-01 |       700 |
| thor     |  500 | 2017-05-01 |      1200 |
+----------+------+------------+-----------+

对于您来说,您已经有正确的组,这只是指定要汇总数据顺序的问题。

来源:https://mysqlserverteam.com/mysql-8-0-2-introducing-window-functions/

欢呼

答案 3 :(得分:0)

这是一个使用等级和连续计数变量的解决方案:

WITH ranked AS (
  SELECT m.* 
    ,ROW_NUMBER() OVER (PARTITION BY m.dat_reg ORDER BY m.id DESC) AS rn
  FROM (
    select id, dat_reg
    ,@cnt := @cnt + 1 AS ccount from members
    ,(SELECT @cnt := 0) var 
   WHERE (dat_reg > DATE_SUB(NOW(), INTERVAL 5 DAY))
  ) AS m
)
SELECT DATE_FORMAT(dat_reg, '%d.%m.%Y') as dat, ccount FROM ranked WHERE rn = 1;

DB-Fiddle