我有一个 MySQL 表,其中每个人都有很多行,我想编写一个查询来聚合具有特殊约束的行。(每人一份)
例如,假设该表由以下数据组成。
name date reason
---------------------------------------
John 2013-04-01 14:00:00 Vacation
John 2013-03-31 18:00:00 Sick
Ted 2012-05-06 20:00:00 Sick
Ted 2012-02-20 01:00:00 Vacation
John 2011-12-21 00:00:00 Sick
Bob 2011-04-02 20:00:00 Sick
我想看看“原因”列的分布。如果我只写如下查询
select reason, count(*) as count from table group by reason
然后我将能够看到这个表的整体原因。
reason count
------------------
Sick 4
Vacation 2
但是,我只对每个人的单一原因感兴趣。应该计算的原因应该来自人员记录中最新日期的行。例如,John 的最新原因是Vacation
,而 Ted 的最新原因是Sick
。而 Bob 的最新原因(也是唯一的原因)是Sick
.
该查询的预期结果应如下所示。(计数总和为 3,因为只有 3 人)
reason count
-----------------
Sick 2
Vacation 1
是否可以编写一个查询,以便在我想查看原因的分布(计数)时计算单个最新原因?
以下是有关该表的一些事实。
- 该表有几千万行
- 大多数时候,每个人都有一个理由。
- 有些人有多种原因,但 99.99% 的人有少于 5 个原因。
- 有大约 30 个不同的原因,而有数百万个不同的名称。
- 该表根据日期范围进行分区。