每个时间表都有许多坡道,每个坡道都有一个end_date
.
我需要列出我所有的坡道,以及一个额外的字段,其中包含坡道的 ID 以及该时间表的最新结束日期。我还需要能够在我的WHERE
子句中使用这个额外的字段。
这通常是使用该MAX
函数的子查询的情况,除了一个问题:斜坡的end_date
字段可以为空,表示斜坡是当前的。因此,SELECT MAX(end_date)
不起作用,因为null
值比非空值“小”。
到目前为止,这就是我想出的:
SELECT r1.*,
(SELECT r2.id
FROM ramp as r2
WHERE schedule_id = r.schedule_id
ORDER BY IF(end_dte is NULL, '9999-99-99', end_dte) DESC
LIMIT 1) as latestId
FROM ramp as r1
这产生了这个表,这正是我想要的:
+-------+-------------+------------+-----------------+--------+------------+------------+----------+
| id | schedule_id | suppr_flag | comment | months | start_dte | end_dte | latestId |
+-------+-------------+------------+-----------------+--------+------------+------------+----------+
| 16 | 7 | NULL | NULL | NULL | 2008-06-23 | NULL | 16 |
| 15 | 6 | NULL | NULL | NULL | 2007-05-01 | 2007-12-31 | 15 |
| 13 | 5 | NULL | 1-15 deals | NULL | 2004-08-11 | NULL | 13 |
| 11 | 4 | NULL | NULL | NULL | 2005-08-11 | NULL | 11 |
| 12 | 4 | NULL | NULL | 12 | 2004-08-11 | 2005-08-10 | 11 |
| 17 | 13 | NULL | NULL | 6 | 2009-03-05 | 2009-09-04 | 19 |
| 18 | 13 | NULL | NULL | 6 | 2009-09-05 | 2010-03-04 | 19 |
| 19 | 13 | NULL | NULL | NULL | 2010-03-05 | NULL | 19 |
| 20 | 14 | NULL | NULL | 12 | 2001-06-18 | 2008-06-17 | 20 |
除了我不能latestId
在 WHERE 子句中使用(它是一个未知列)。
你有什么想法?