1

我正在尝试编写一个查询,该查询通过 id 从表组中获取最大值和最小值。基本上,我有一个表格,可以从现有的 contract_id 中添加新的年度金额的续订,如下所示:

客户 ID | 合同编号 | 开始日期 | 结束日期 | 收入
6 | 125 | 2012-01-01 | 2012-12-31 | 10,000
6 | 126 | 2012-01-01 | 2013-12-31 | 5,000
6 | 125 | 2013-01-01 | 2013-12-31 | 12,000
6 | 126 | 2014-01-01 | 2015-12-31 | 8,000

我想取最小 start_date、最大 end_date 和该 end_date 的相应收入,按给定 customer_id 的contract_id 分组。

因此,理想情况下,查询将返回:

客户 ID | 合同编号 | 开始日期 | 结束日期 | 收入
6 | 125 | 2012-01-01 | 2013-12-31 | 12,000
6 | 126 | 2012-01-01 | 2015-12-31 | 8,000

我可以得到最大的东西,但是我在同一个查询中同时提取 MAX 和 MIN 时遇到了麻烦。任何帮助将不胜感激。谢谢!

4

2 回答 2

1

使用联合使您能够将查询分成两半 - 一个用于“max”,另一个用于“min”,并且不要使用 min 函数的 max;而是按目标字段对数据进行排序并获取第一行。

select * from (
  select * from mytable
  where customer_id = ?
  order by start_date, created_at
  limit 1) x
union all
select * from (
  select * from mytable
  where customer_id = ?
  order by end_date desc, created_at desc
  limit 1
) y

注意:这将始终返回 2 行,即使“min”和“max”行是同一行(如果客户只有一行)

编辑:

还订购created_at以打破关系(来自稍后添加的评论)

于 2012-05-12T19:31:18.077 回答
1

您应该尝试此查询还查看屏幕截图以进行验证(见图 1

SELECT r.`contract_id`,r.`start_date`,
(SELECT sub_r.`end_date` FROM `table` sub_r where sub_r.`contract_id` = r.`contract_id` 
ORDER BY sub_r.`revenue` DESC limit 1 )
AS `end_date`,
(SELECT sub_r.`revenue` FROM `table` sub_r where sub_r.`contract_id` = r.`contract_id` 
ORDER BY sub_r.`revenue` DESC limit 1 )
AS `revenue` 
FROM `table` r GROUP BY r.`contract_id`;

图 1

在此处输入图像描述

于 2012-05-12T20:52:14.843 回答