仅显示最新日期不为空的ID

时间:2017-09-05 11:26:06

标签: sql sql-server sql-server-2014

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子句或选择列表中的子查询以及列   被聚合是一个外部参考

2 个答案:

答案 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()

也不会