访问具有最新日期的 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 唯一记录,包括来自单个表的空日期的主要内容,如果未能解决你的问题,请参考以下文章
Python sqlite3 SQL查询获取具有最新日期但每个唯一列限制的所有条目