mysql - 如何在 MySQL Group By 查询中查找唯一值?

标签 mysql

MySQL TABLE : numbers

+----+-----+------------+
| ID | NUM |   CREATED  |
+----+-----+------------+
| 1  | 11  | 2018-01-01 |
+----+-----+------------+
| 2  | 22  | 2018-02-01 |
+----+-----+------------+
| 3  | 11  | 2018-03-01 |
+----+-----+------------+
| 4  | 44  | 2018-04-01 |
+----+-----+------------+
| 6  | 44  | 2018-04-02 |
+----+-----+------------+
| 5  | 22  | 2018-05-01 |
+----+-----+------------+

在此表中,ID主键NUM 是随机值,CREATED日期

My Query:

SELECT
  DATE_FORMAT(CREATED,'%Y-%m') AS Month,
  COUNT(NUM) AS TotalNum,
  COUNT(DISTINCT(NUM)) AS UniqueNum
FROM
  `numbers`
GROUP BY
  DATE_FORMAT(CREATED,'%Y-%m')

Result of My Query:

+---------+----------+-----------+
| Month   | TotalNum | UniqueNum |
+---------+----------+-----------+
| 2018-01 |    1     |     1     |
+---------+----------+-----------+
| 2018-02 |    1     |     1     |
+---------+----------+-----------+
| 2018-03 |    1     |     1     |
+---------+----------+-----------+
| 2018-04 |    2     |     1     |
+---------+----------+-----------+
| 2018-05 |    1     |     1     |
+---------+----------+-----------+

But my Expected Result is :

+---------+----------+-----------+
| Month   | TotalNum | UniqueNum |
+---------+----------+-----------+
| 2018-01 |    1     |     1     |
+---------+----------+-----------+
| 2018-02 |    1     |     1     |
+---------+----------+-----------+
| 2018-03 |    1     |     0     |
+---------+----------+-----------+
| 2018-04 |    2     |     1     |
+---------+----------+-----------+
| 2018-05 |    1     |     0     |
+---------+----------+-----------+

UniqueNum 的结果在 2018-03 月应为 0。因为 NUM 11 已经存在于 2018-01 月。

还有 UniqueNum 的结果在 2018-05 月份应为 0。因为 NUM 22 已经存在于 2018-02 月。

我想找到每个月的唯一编号。如何通过更新我的 MySQL 查询 获得预期结果?请帮忙。

最佳答案

您只需将表连接到自身,并只返回在之前的 CREATED 日期不存在的数字。

SELECT
  DATE_FORMAT(n.CREATED,'%Y-%m') AS Month,
  COUNT(n.NUM) AS TotalNum,
  COUNT(un.NUM) AS UniqueNum
FROM
  `numbers` n
LEFT JOIN (SELECT ID, NUM FROM numbers n1 WHERE NOT EXISTS (SELECT 1 FROM numbers n2 WHERE n1.NUM = n2.NUM AND n2.CREATED < n1.CREATED)) un ON n.ID = un.ID 
GROUP BY
  DATE_FORMAT(n.CREATED,'%Y-%m')

关于mysql - 如何在 MySQL Group By 查询中查找唯一值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52147571/

相关文章:

php - 带有 Google map 示例的 Google PHP/MySQL 中的 Javascript 错误

mysql - 是否可以从文件中选择mysql记录?

mysql - 使用 database/sql 从 golang 中的 mysql 中检索记录

php - 创建网格而不是表格

mysql - 如何有效地找到以 N 开头的序列中的第一个间隙(缺失的数字)

mysql - 无法对 phpmyadmin 数据库执行 JDBC 请求(未找到适合 jdbc 的驱动程序 :mysql://localhost:3306/ck)

mysql - 如何从数据库中取出数据 "disappear"? MySQL

MYSql 选择排除(not in 和 not like 的问题)

mysql - 在mysql中使用同一个表分割多个计数

mysql - 多个位置