0

我正在尝试选择最后一个enddateper nr。如果nr包含一个enddatewith value NULL,则表示它nr仍然处于活动状态。简而言之,我不能使用,MAX(enddate)因为它会在我需要的时候选择日期。2013-09-25NULLNULL

我尝试了以下查询,但似乎NULL IN (enddate)没有返回我怀疑的内容。即:'如果数组包含至少一个值NULL......'。换句话说,NULL应该 overrank MAX()

SELECT nr,
 CASE WHEN NULL IN (enddate) THEN NULL ELSE MAX(enddate) END
 FROM myTable
 GROUP BY nr

有人知道如何替换这个表达式吗?

4

3 回答 3

0

您可以使用下面的查询。它在其他日期之前返回 NULL(前提是您输入的日期足够大),然后恢复 NULL。

SELECT nr, CASE d WHEN '20990101' THEN NULL ELSE d END d
FROM (
    SELECT nr,
    CASE MAX(ISNULL(enddate, '20990101') d
    FROM myTable
    GROUP BY nr
)

我无法检查语法,所以可能有小错别字。

于 2013-09-26T11:13:49.383 回答
0

您可以使用此查询。CTE 计算忽略任何空值的最大日期,然后将其连接回表以查看每个 nr 值是否有空值。如果 case 语句存在或 CTE 的最大日期,则 case 语句返回 null。

WITH CTE1 AS 
(SELECT nr, MAX(enddate) MaxEnddate
FROM myTable
GROUP BY nr)
  SELECT CTE1.nr,
  CASE WHEN MyTable.enddate IS NULL AND MyTable.NR IS NOT NULL THEN NULL ELSE CTE1.MaxEndDate END AS EndDate
  FROM CTE1
  LEFT JOIN MyTable
  ON MyTable.nr=CTE1.nr
  AND MyTable.enddate IS NULL
于 2013-09-26T12:54:29.780 回答
0

只是为了建立@Szymon的答案:

drop table #temp
create table #temp (MyDate date) insert into #temp (MyDate) values ('1/1/2010'),('1/1/2011'),('1/1/2012'),(NULL)
select * from #temp

SELECT 
    (CASE WHEN MAX(ISNULL(MyDate, '2099-01-01')) = '2099-01-01' THEN NULL ELSE MAX(ISNULL(MyDate, '2099-01-01')) END) as Max_Date
FROM    
    #temp

该查询将 NULL 值替换为“2099-01-01”。然后,它查看 Max 是否等于“2099-01-01”,如果是,则返回 NULL,否则返回实际的 Max。

于 2017-04-28T17:24:36.527 回答