1

我想知道以下是否可能,如果是,那么我将如何去做。假设我在 MySQL 表中有一堆具有一些相似值的条目。我定期GROUP BY将它们组合成更具可读性的条目,但其中一列是时间值,每个条目都不同。我想要做的是为每个条目添加一列,该列是GROUP BY语句的结果,其中包含进入组的所有条目的日期范围。例如,如果我有以下内容:

+------+------+------------+--------------------+
| id   | name | work_date  | daily_typing_pages |
+------+------+------------+--------------------+
|    1 | John | 2007-01-24 |                250 |
|    2 | Ram  | 2007-05-27 |                220 |
|    3 | Jack | 2007-05-06 |                170 |
|    3 | Jack | 2007-04-06 |                100 |
|    4 | Jill | 2007-04-06 |                220 |
|    5 | Zara | 2007-06-06 |                300 |
|    5 | Zara | 2007-02-06 |                350 |
+------+------+------------+--------------------+

a 的结果GROUP BY name是这样的:

+------+----------+
| name | COUNT(*) |
+------+----------+
| Jack |        2 |
| Jill |        1 |
| John |        1 |
| Ram  |        1 |
| Zara |        2 |
+------+----------+

但我想要这样的东西:

+------+----------+-------------------------+
| name | COUNT(*) |        DateRange        |
+------+----------+-------------------------+
| Jack |        2 | 2007-04-06 - 2007-05-06 |
| Jill |        1 | 2007-04-06              |
| John |        1 | 2007-01-24              |
| Ram  |        1 | 2007-05-27              |
| Zara |        2 | 2007-02-06 - 2007-06-06 |
+------+----------+-------------------------+

如果有人可以帮助解决这个问题,将不胜感激。谢谢你。

4

2 回答 2

2

使用案例流控制语句:)

select name, count(*), 
     case when count(*) > 1 then concat(min(work_date), ' - ', max(workdate) 
        else work_date end as  DateRange   
from fooTable 
group by id;
于 2013-07-15T21:15:19.037 回答
1

我会这样做:

SELECT
  `name`,
  COUNT(id) AS `count`,
  MIN(`work_date`) AS `min_work_date`,
  MAX(`work_date`) as `max_work_date`
FROM table
GROUP BY `name`

HAVING这将为您提供作为单独列的最小和最大日期,如果您需要使用子句对结果应用聚合后过滤,这可能很有用。

例如,如果您想查找人员 max_work_date 在 min_work_date 之后 30 天以上的所有情况

SELECT
  `name`,
  COUNT(id) AS `count`,
  MIN(`work_date`) AS `min_work_date`,
  MAX(`work_date`) as `max_work_date`
FROM table
GROUP BY `name`
HAVING DATEDIFF(`max_work_date`,`min_work_date`) > 30 
于 2013-07-15T21:24:59.490 回答