访问具有最新日期的 SQL 唯一记录,包括来自单个表的空日期

Posted

技术标签:

【中文标题】访问具有最新日期的 SQL 唯一记录,包括来自单个表的空日期【英文标题】:Access SQL unique records with latest date including null dates from single table 【发布时间】:2015-03-17 20:14:53 【问题描述】:

我有一个具有以下示例结构的表:

Identifier| Latitude | Longitude |...many columns...|DateWhenStatusObserved|ID|
----------+----------+---------- +------------------+----------------------+--+
2823DC012 | 28.76285 | 23.70195  |  ...             |            1994/10/28| 1|
2823DC012 | 28.76285 | 23.70195  |  ...             |            1995/04/05| 2|
2822DD030 | 28.76147 | 22.98270  |  ...             |                  NULL| 3|
...

还有更多列,但不必对这些列进行评估,所有列都应该从查询中返回。

我希望 SQL 查询仅返回 Identifier 列的唯一记录,其中每个唯一标识符的最新日期。不幸的是,还有记录是 DateWhenStatusObserved 列中的日期为 NULL,并且在许多情况下,标识符(地理站点)的唯一记录具有 NULL 日期。

类似的SQL问题已经有很多答案了,比如:

How can I include null values in a MIN or MAX?

SELECT only rows with either the MAX date or NULL

http://bytes.com/topic/access/answers/719627-create-query-evaluate-max-date-recognizing-null-high-value

然而,这些并未具体说明如何将 iif 语句与聚合 Max 函数一起使用,以允许 NULL 日期记录通过,同时保持唯一标识符(地理站点)记录。

我只得到使用子查询和 Max(IIF()) 组合返回的非 NULL 最大日期记录。我终于从没有 Joins 并依赖 WHERE 子句的基本子查询中得到了合理的结果,但是我从 NULL 日期得到重复的标识符记录,因为我必须使用 OR 而不是 AND 来获取返回的任何行。

这是我只返回非 NULL 最大日期记录的尝试之一:

SELECT BasicInfoTable.*
FROM Basic_information_WUA AS BasicInfoTable 
INNER JOIN 
(
SELECT Identifier, MAX (IIF(DateWhenStatusObserved IS NULL, 0, DateWhenStatusObserved)) AS MaxDate 
FROM Basic_information_WUA
GROUP BY Identifier
)  
AS Table2 ON BasicInfoTable.Identifier = Table2.Identifier AND BasicInfoTable.DateWhenStatusObserved = Table2.MaxDate;

那么为什么这不适用于 NULL 日期的情况?

如果能帮助我找到解决此问题的近乎最佳查询,我将不胜感激。

谢谢

【问题讨论】:

您需要提供与 BasicInfoTable.DateWhenStatusObserved = Table2.MaxDate 类似(为 NULL)的逻辑。不能“比较”空值。 @AnthonyHorne - 谢谢您建议的编辑使查询运行完美。在没有日期的情况下,查询返回唯一标识符字段记录、最新(最大)日期和空日期。然后更改结果为:ON (IIF(BasicInfoTable.DateWhenStatusObserved IS NULL, 0,BasicInfoTable.DateWhenStatusObserved) = IIF(Table2.MaxDate IS NULL, 0, Table2.MaxDate)。安东尼,很遗憾,我无法投票赞成您的答案,因为它仅在 cmets 中。 很高兴它为您工作。通常只需要另一双眼睛。 我在上面的评论中不小心在我的代码部分末尾遗漏了一个右括号/括号,但我无法编辑它。请记住。 【参考方案1】:

您需要提供与 BasicInfoTable.DateWhenStatusObserved = Table2.MaxDate 类似的(为 NULL)逻辑。不能“比较”空值。

【讨论】:

以上是关于访问具有最新日期的 SQL 唯一记录,包括来自单个表的空日期的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:来自多行的最新属性集和日期

SQL Server:从最大日期/最新日期的记录中获取数据

Python sqlite3 SQL查询获取具有最新日期但每个唯一列限制的所有条目

SQL - 为表中的每个货币代码(在两个定义的日期之间)创建一个具有唯一日期和货币记录的表

SQL 检索最新记录,按唯一外键分组

使用 group by 获取最新的日期记录