mariadb 玛丽亚数据库/MySQL:移动时间窗的部分"总计"行数

5uzkadbs  于 2023-01-09  发布在  Mysql
关注(0)|答案(4)|浏览(150)

我有一个MariaDB数据库与用户和他们相应的注册日期,像:

+----+----------+----------------------+
| ID | Username | RegistrationDatetime |
+----+----------+----------------------+
|  1 | A        |  2022-01-03 12:00:00 |
|  2 | B        |  2022-01-03 14:00:00 |
|  3 | C        |  2022-01-04 23:00:00 |
|  4 | D        |  2022-01-04 14:00:00 |
|  5 | E        |  2022-01-05 14:00:00 |
+----+----------+----------------------+

我想知道在每个日期结束时系统中的用户总数,只需要一个查询-这可能吗?
所以结果应该是这样的:

+------------+-------+
|   Date     | Count |
+------------+-------+
| 2022-01-03 |     2 |
| 2022-01-04 |     4 |
| 2022-01-05 |     5 |
+------------+-------+

是的,使用PHP进行单个查询和循环日期是很容易的,但是如何只使用一个查询呢?

EDIT感谢您的回复,是的,用户可能会被取消/删除,即在特定时间段内不可能按最大值(ID)进行操作。ID列中可能存在空白

v8wbuo2f

v8wbuo2f1#

使用COUNT()窗口函数:

SELECT DISTINCT 
       DATE(RegistrationDatetime) AS Date,
       COUNT(*) OVER (ORDER BY DATE(RegistrationDatetime)) AS Count
FROM tablename;

请参见demo

p4rjhz4m

p4rjhz4m2#

SELECT 
   date(RegistrationDatetime ),
   sum(count(*)) over (order by date(RegistrationDatetime ))
FROM
   mytable
GROUP BY
   date(RegistrationDatetime );

输出:
| 日期(注册日期时间)|sum(count(*))超过(按日期排序(RegistrationDatetime))|
| - ------| - ------|
| 2022年1月3日|第二章|
| 2022年1月4日|四个|
| 2022年1月5日|五个|
参见:DBFIDDLE

mlnl4t2r

mlnl4t2r3#

SELECT t1.RegistrationDatetime AS Date,
       (SELECT COUNT(*) FROM users t2 WHERE t2.RegistrationDatetime <= t1.RegistrationDatetime) AS Count
FROM users t1
GROUP BY t1.RegistrationDatetime
wgxvkvu9

wgxvkvu94#

如果没有已取消的用户,您可以执行以下操作:

SELECT DATE(RegistrationDatetime) AS date_, MAX(Id) AS cnt
FROM tab
GROUP BY DATE(RegistrationDatetime)

检查here演示。
否则,您可能需要使用ROW_NUMBER来生成该排名:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER(ORDER BY RegistrationDatetime) AS rn 
    FROM tab
)
SELECT DATE(RegistrationDatetime) AS date_, MAX(rn) AS cnt
FROM cte
GROUP BY DATE(RegistrationDatetime)

查看here演示。

相关问题