Person Date
p1 null
p1 05/22/2000
p1 05/21/2000
p2 08/03/2000
p2 08/02/2000
p2 08/01/2000
p3 08/20/2000
p4 null
p4 02/01/2001
如何查询此结果,我会排除那些最新日期为'p'
的人NULL
,例如p1
在其最新日期null
时{1}}不会显示在与p4
相同的结果列表中。我知道简单的Where clause
不适用于此版本,因为它只会删除p1
值为null
的{{1}}。我甚至尝试过使用WHERE MAX(DATE) <> ''
,但它给了我错误:
聚合可能不会出现在WHERE子句中,除非它在a中 包含在HAVING子句或选择列表中的子查询以及列 被聚合是一个外部参考
答案 0 :(得分:1)
如果您要排除所有至少有一条Date = NULL
条记录的人,那么您可以使用NOT IN
:
SELECT *
FROM yourtable
WHERE Person NOT IN
(SELECT Person
FROM yourtable
WHERE Date IS NULL
)
答案 1 :(得分:0)
您无法确定该null是否为延迟日期或早期日期,因此您的请求无效。我将不得不重新定义/猜测你在寻找什么:
“我只想要列出每一行中都有日期值的人员ID”
这很简单:
SELECT
personID
FROM
table
GROUP BY
personID
HAVING count(date) = count(*)
count(date)
将不计算空值,count(*)
将计算具有空日期的行,因为您没有指定要计数的特定(可为空)列。 count(personid)
如果对您更有意义,也应该代替count(*)
。在任何一种情况下,最终都会得到一个低于count(date)
的{{1}},并且通过声明您只想要这两个计数相等的结果,这意味着您只能获得那些没有任何数据的ID行中的空值
有趣的是,您尝试执行此操作count(*)
意味着您认为null和空字符串是等效的。在SQLServer中,这不是真的。要测试NULL的内容,请使用MAX(date) <> ''
。当聚合组中存在非空值时,IS/ISNOT NULL
将永远不会返回null,MAX()