2013-11-04 14 views
13

Cho phép nói rằng tôi có một bảng tên là thử nghiệm như thế này:Làm thế nào xem xét NULL là ngày MAX thay vì bỏ qua nó trong 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' 

Và tôi muốn nhận được từ bảng này:

ID DATE  

1  NULL  
2  '2013-05-02' 

Đây là câu hỏi của tôi:

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

Vấn đề là MYSQL bỏ qua các giá trị NULL và trả lại cho tôi

ID DATE  

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

Làm thế nào tôi có thể làm như vậy khi có NULL phải mất MAX là NULL?

+0

Bất kỳ triển khai SQL phù hợp nào cũng nên thực hiện điều đó. – EJP

Trả lời

15

này cung cấp cho một shot:

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

Nó hoạt động nhờ. Bạn có thể vui lòng giải thích cho tôi MAX (NGÀY IS NULL) = 0 – user2741700

+0

Về cơ bản, nếu không có NULL thì hãy sử dụng tối đa (DATE) –

7

Null không phải là một giá trị hoặc một số nó chỉ là null. Đây là lý do tại sao bạn sử dụng "nơi col1 là null" và không phải "col1 = null". Cách giải quyết là sử dụng IFNULL và đặt giá trị thực sự cao.

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

bạn đang gián tiếp giới thiệu một ngày tối đa và không sử dụng 'NULL' – ezdazuzena

2

Bạn có thể sử dụng một IF tuyên bố:

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

FYI NULL bị bỏ qua khi sử dụng trong aggregation chức năng.

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) 
Các vấn đề liên quan