我想根据日期字段选择表格中的最新行。
应该取消最新日期。但是,如果日期为NULL,则应该优先于任何max(end_date)。
我最接近的是以下内容:
SELECT id, status_id
FROM
contacts AS cc
INNER JOIN
statuses AS s ON (s.id = cc.id)
INNER JOIN (
SELECT id, max(end_date) as max_end_date FROM statuses
GROUP BY id
) s2 ON s2.max_end_date = s.end_date AND s2.id = s.id
如果我有两行,如下所示:
id end_date
1 2014-06-02
2 2015-06-02
它应该使用end_date" 2015-06-02" - 它正确地做了。
但是,如果行如下所示它不起作用:
id end_date
1 2014-06-02
2 NULL
它应该返回结束日期为NULL的行。
任何帮助都将不胜感激,谢谢。
答案 0 :(得分:1)
因此,您要问的问题是,您正在尝试查看该表是否具有空值以及max(end_date)
是什么。这些本质上是两个非常不同的问题。这些问题通常以非常不同的方式解决,因为找到一个问题的效率与找到另一个问题的效率不同。
我通常使用的方法基本上不在表中,因为它们会在同一个表上添加另一个内连接。这对提高效率并不是很好。相反,我认为这个查询将满足您的需求:
SELECT id, status_id
FROM
contacts AS cc
INNER JOIN
statuses AS s ON (s.id = cc.id)
INNER JOIN (
SELECT id, max(end_date) as max_end_date, sum(isnull(end_date)) as nullcount
FROM statuses
GROUP BY id
) s2 ON case when nullcount > 0
Then null
else s2.max_end_date end = s.end_date
AND s2.id = s.id
这个查询很奇怪,但它可以让你弄清楚是否有空值。在我们找到max(end_date)
的同时,此查询将空值的数量相加。如果end_date为null,isnull
将返回1,如果它不为null,则返回0,因此如果我们对这些int求和,则结果应该是id对end_date的空值数。
然后,连接条件是一个case语句。如果空值的数量大于0,我们将使用null作为end_date值。否则,我们将使用子查询返回的最大值。