2017-09-05 31 views
-1
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'其最新的日期是NULLp1在其最新的日期null一樣,P1不應該在顯示結果列表與p4相同。我知道一個簡單的Where clause將無法​​與這一個,因爲它只會刪除p1null值。我甚至用WHERE MAX(DATE) <> ''嘗試,但它給了我錯誤:只顯示的ID,其中最新的日期不是空

An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference

+4

如何知道最新日期,如果它是NULL? –

+1

顯示您的數據的預期結果 –

+0

您想要排除所有至少有一個記錄帶有'null'日期的人,對嗎? –

回答

1

如果要排除誰擁有至少一個紀錄Date = NULL所有的人,那麼你可以使用NOT IN

SELECT * 
    FROM yourtable 
WHERE Person NOT IN 
     (SELECT Person 
      FROM yourtable 
      WHERE Date IS NULL 
     ) 
+1

「就我所知,p1不會顯示在與p4」 –

+1

相同的結果列表中,如果至少有一個Date = NULL的條目,他希望完全排除這些人。 –

+0

@CaiusJard你是對的。我刪除了第二部分的答案 –

0

你可以如果那個null是一個遲到的日期或者是一個早期的日期,那麼你的請求就沒有意義了。我不得不重新定義/猜你在找什麼:

「我只想要誰擁有每一個行的日期值的人ID列表」

這就像一些簡單:

SELECT 
    personID 
FROM 
    table 
GROUP BY 
    personID 
HAVING count(date) = count(*) 

count(date)用,因爲你沒有指定特定的(可爲空)的列數空日期將不計空,count(*)將計算行。如果它對你更有意義,count(personid)也應該代替count(*)。無論哪種情況,最終的結果都是count(date),它低於count(*),並聲明只希望在這兩個數相等的情況下得到結果,這意味着您只能得到那些在其行中沒有任何空位的ID

有趣的是,你試圖做這個MAX(date) <> ''意味着你相信null和空字符串是等價的。在SQLServer中,這不是真的。要測試NULL值,請使用IS/ISNOT NULLMAX()將永遠不會返回null當聚合組中有非空值,也不會MIN()

+1

「p1不會顯示在與p4」 –

+0

相同的結果列表中,當我按'p1'分組,'count(date)'爲2但count(*)爲3 ,並且HAVING要求這兩個值相等。「p1不顯示在結果列表中,與p4相同」 –