编辑:
我删除了结尾处令人困惑的言论,并添加了一个我认为不相关的附加列pl_id(由于我明显缺乏对group by的理解)。在尝试发布建议时,我遇到了一个问题,即引入MAX / Group By会导致

  | name  | license_plate | pl_id | start_date |
  | aaron | AA-AA-22      |     3 | 2016-1-1   |


我期望的地方:

  | name  | license_plate | pl_id | start_date |
  | aaron | AA-AA-22      |     4 | 2016-1-1   |


因此,以某种方式将牌照AA-AA-22的最大日期(2016-1-1)显示在pl_id = 3的记录中,为什么结果返回记录的日期是pl_id 4?
结束编辑

我有一个带有列的表:


名称
牌照
开始日期


我需要一个查询,该查询为每个车牌恰好返回最大start_date或start_date为空的一条记录。但是空的开始日期应优先于最大开始日期。

每个车牌保证最多包含一个start_date = null的条目,但可以包含多个带有有效“ start_date” -s的条目。

因此,例如,在下表上执行时:

  | name  | license_plate | pl_id | start_date |
  | aaron | AA-AA-11      |     1 | 2015-1-1   |
  | aaron | AA-AA-11      |     2 | null       |
  | aaron | AA-AA-22      |     3 | 2015-1-1   |
  | aaron | AA-AA-22      |     4 | 2016-1-1   |
  | bill  | BB-BB-11      |     5 | 2015-1-1   |
  | bill  | BB-BB-11      |     6 | null       |
  | bill  | BB-BB-22      |     7 | 2015-1-1   |
  | clark | CC-CC-11      |     8 | 2015-1-1   |
  | clark | CC-CC-11      |     9 | 2016-1-1   |
  | dave  | DD-DD-11      |    10 | 2014-1-1   |
  | dave  | DD-DD-11      |    11 | 2015-1-1   |
  | dave  | DD-DD-11      |    12 | 2016-1-1   |
  | eddy  | EE-EE-11      |    13 | null       |


查询应返回:

  | name  | license_plate | pl_id | start_date |
  | aaron | AA-AA-11      |     2 | null       |
  | aaron | AA-AA-22      |     4 | 2016-1-1   |
  | bill  | BB-BB-11      |     6 | null       |
  | bill  | BB-BB-22      |     7 | 2015-1-1   |
  | clark | CC-CC-11      |     9 | 2016-1-1   |
  | dave  | DD-DD-11      |    12 | 2016-1-1   |
  | eddy  | EE-EE-11      |    13 | null       |

最佳答案

SELECT name, license_plate, IF(max(IF(start_date IS NULL, '2099-01-01',  start_date)) = '2099-01-01', null, max(start_date))
FROM table
GROUP BY name, license_plate;


如果需要,可以将“ 2099-01-01”更改为更大的数字。

在您的数据集上进行了测试。

10-08 08:20
查看更多