2013-11-04 15 views
13

Powiedzmy, że mam tabeli o nazwie testu takiego:Jak rozważyć NULL jako datę MAX zamiast ignorować go w MySQL?

ID DATE  

1  '2013-01-26' 
1  NULL 
1  '2013-03-03'  
2  '2013-02-23'  
2  '2013-04-12'  
2  '2013-05-02' 

I chciałbym, aby z tej tabeli:

ID DATE  

1  NULL  
2  '2013-05-02' 

Oto moje zapytanie:

select ID, max(DATE) 
from test 
group by ID 

Problem polega na tym, że MYSQL ignoruje wartości NULL i zwraca mi

ID DATE  

1  '2013-03-03' 
2  '2013-05-02' 

Jak to zrobić, gdy jest NULL, przyjmuje MAX jako NULL?

+0

Każda zgodna implementacja SQL powinna to zrobić. – EJP

Odpowiedz

15

Daj ten strzał:

SELECT ID, case when MAX(DATE IS NULL) = 0 THEN max(DATE) END AS DATE 
FROM test 
GROUP BY ID; 
+1

http://sqlfiddle.com/#!2/76290/3 –

+0

To dziękuje. Czy możesz po prostu wyjaśnić mi MAX (DATA JEST NIŻEJ) = 0 – user2741700

+0

Zasadniczo mówiąc, jeśli nie ma żadnych wartości NULL, wówczas użyj max (DATE) –

7

Null nie jest wartością lub numer to jest po prostu zerowa. Dlatego używasz "gdzie col1 ma wartość null", a nie "col1 = null". Obejściem jest użycie IFNULL i ustawienie naprawdę wysokiej wartości.

select ID, max(IFNULL(DATE,'3000-01-01')) 
from test 
group by ID 
+0

pośrednio wprowadzasz maksymalną datę i nie używasz wartości "NULL" – ezdazuzena

2

Można użyć oświadczenia, jeżeli:

SELECT ID, IF(max(DATE IS NULL) = 0, max(DATE), NULL) AS DATE 
FROM test 
GROUP BY ID; 
1

FYI NULL jest ignorowana, gdy używany w aggregation funkcji.

mysql> SELECT * FROM null_test; 
+------+ 
| c | 
+------+ 
| NULL | 
| 1 | 
| 2 | 
| 3 | 
+------+ 
4 rows in set (0.00 sec) 

mysql> SELECT COUNT(c) FROM null_test; 
+----------+ 
| COUNT(c) | 
+----------+ 
|  3 | <= not 4 but 3 
+----------+ 
1 row in set (0.00 sec) 

mysql> SELECT COUNT(*) FROM null_test; 
+----------+ 
| COUNT(*) | 
+----------+ 
|  4 | <= in this case not 3 but 4 
+----------+ 
1 row in set (0.00 sec) 

mysql> SELECT AVG(c) FROM null_test; 
+--------+ 
| AVG(c) | 
+--------+ 
| 2.0000 | <= not (1+2+3)/4 but (1+2+3)/3 
+--------+ 
1 row in set (0.00 sec)