mysql - 使用 MySQL 从同一个表中以不同的顺序和数量提取信息

标签 mysql count group-by nested cumulative-sum

第一次发帖。例如,假设我有一个包含 12 个条目的表;

+--------+------------+
| name   | date       |
+--------+------------+
| P1     | 2011-12-01 |
| P2     | 2012-01-01 |
| P3     | 2012-02-01 |
| P4     | 2012-02-01 |
| P5     | 2012-02-01 |
| P6     | 2012-05-01 |
| P7     | 2012-04-01 |
| P8     | 2012-05-01 |
| P9     | 2012-05-01 |
| P10    | 2012-06-01 |
| P11    | 2012-06-01 |
| P12    | 2012-03-01 |
+--------+------------+

我已按日期对表中的信息进行了分组,保留了所有 ID(未显示)的计数,并创建了一个运行总计。我已经这样实现了;

(SELECT date, c as count, (@s := @s + c) as run_total 
FROM
(SELECT D1.date, Count(D1.person_id) as c, @s := 0
FROM table D1
GROUP BY month(D1.date)
ORDER BY D1.date) as T1);

输出;

+------------+-------+-----------+
| date       | count | run_total |
+------------+-------+-----------+
| 2011-12-20 |     1 |         1 |
| 2012-01-31 |     1 |         2 |
| 2012-02-20 |     3 |         5 |
| 2012-03-05 |     1 |         6 |
| 2012-04-20 |     1 |         7 |
| 2012-05-20 |     3 |        10 |
| 2012-06-01 |     2 |        12 |
+------------+-------+-----------+

到目前为止还不错。这是我松开它的地方。我怎样才能提取最近的 4 个条目并得到像这样的东西???其中日期保持升序,更重要的是 run_total 保持不变;

-----我正在努力实现的目标-----

----------------------------------
| 2012-03-05 |     1 |         6 |
| 2012-04-20 |     1 |         7 |
| 2012-05-20 |     3 |        10 |
| 2012-06-01 |     2 |        12 |
+------------+-------+-----------+

------------------------------------

为了解决这个问题,我创建了这个;

(SELECT date, c as count, (@s := @s + c) as run_total
FROM
(SELECT D1.date, Count(D1.person_id) as c, @s := 0
FROM table D1
GROUP BY month(D1.date)
ORDER BY D1.date desc limit 4) as T1)
ORDER BY date;

但是我没有得到想要的结果;

+------------+-------+-----------+
| date       | count | run_total |
+------------+-------+-----------+
| 2012-03-05 |     1 |         1 |
| 2012-04-20 |     1 |         2 |
| 2012-05-20 |     3 |         5 |
| 2012-06-01 |     2 |         7 |
+------------+-------+-----------+

日期是有序的,但 run_totals 都乱七八糟。如前所示,1 应该是 6、2 -> 7、5 -> 10 和 7 -> 12。

同样,我想要实现的是;

----------------------------------
| 2012-03-05 |     1 |         6 |
| 2012-04-20 |     1 |         7 |
| 2012-05-20 |     3 |        10 |
| 2012-06-01 |     2 |        12 |
+------------+-------+-----------+

最佳答案

SELECT * FROM
(SELECT *
FROM (SELECT date, count, (@s := @s + c) as run_total 
FROM
(SELECT D1.date, Count(D1.person_id) as c, @s := 0
FROM table D1
GROUP BY month(D1.date)
ORDER BY D1.date) as T1) tmp
ORDER BY `date` DESC
LIMIT 4) tmp2
ORDER BY `date` ASC

它获取您查询的 4 条最新记录,然后按日期对它们重新排序。
总数保持不变。

关于mysql - 使用 MySQL 从同一个表中以不同的顺序和数量提取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11233241/

相关文章:

PHP 管理员批准用户注册

MySQL选择查询忽略特殊字符

python - Pandas 数据框中的计数和计数

python - list.count() 表示列表中有一项时有两项

mysql - SQL Group By 和两列计数

mysql - 多列分组依据

mysql - FPDF session 变量

MySQL 删除字段;外键错误号 150

mysql - 连接中的 SQL 计数

sql - 如何在 SQL 中返回每个组的增量组号