2011-11-24 29 views
5

Tôi có một cơ sở dữ liệu có các cột như sau.Điền các khoảng trống trong giá trị trả về truy vấn

Id Date    Value 
1 12/01/2010 09:30 127.31 
1 12/01/2010 09:31 133.41 
1 12/01/2010 09:32 147.54 
1 12/01/2010 09:34 155.66 

Về cơ bản, tôi lưu trữ các giá trị tương ứng với dấu thời gian. Tuy nhiên, nếu giá trị bằng 0, tôi không lưu trữ nó (Cơ sở dữ liệu thực sự lớn và số 0 xuất hiện thường xuyên, vì vậy chúng tôi quyết định không bao gồm các hàng đó để tiết kiệm không gian). Trong ví dụ trên, 12/01/2010 09:33 có giá trị 0 để nó không được lưu trữ. Tuy nhiên, khi người dùng truy vấn cơ sở dữ liệu, anh ấy thực hiện điều gì đó như

select * from table where Id = '1' and Date > to_date('12/01/2010', 'MM/DD/YYYY')` 

và tôi cần điền vào khoảng trống và đề cập đến dấu thời gian với 0 giá trị. Tôi có thể làm cái này như thế nào?

+2

Bạn có chắc chắn cần phải làm điều này trong cơ sở dữ liệu chứ không phải ở phía khách hàng? –

+0

Bạn quyết định không lưu trữ số không bằng cách nào? - bạn không thể thay đổi điều này sao cho nó không ảnh hưởng đến cột dấu thời gian hoặc bạn muốn loại trừ dấu thời gian là 00/00/0000/00:00 – Rob

+0

@JonSkeet, Hy vọng. Tôi đang mở để đề xuất thay thế. Tôi muốn xem những gì hiệu quả. – Aks

Trả lời

8
select 
    nvl(b.id,1) as id, 
    alldates.Date as Date, 
    nvl(b.value,0) as value 
from 
    (select level/1440 + to_date('12/01/2010', 'MM/DD/YYYY') as Date 
     from dual 
     connect by level < 1440 --one day 
    ) alldates 
    left join 
    (select * from table where Id = '1' and Date > to_date('12/01/2010', 'MM/DD/YYYY') b 
    on alldates.Date = b.Date 

CẬP NHẬT (trả lời bình luận):

select 
    nvl(b.id,1) as id, 
    alldates.Date as Date, 
    nvl(b.value,0) as value, 
    nvl(b.value, lag(b.value) over (order by b.Date nulls last)) last_valid_value 
from 
    (select level/1440 + to_date('12/01/2010', 'MM/DD/YYYY') as Date 
     from dual 
     connect by level < 1440 --one day 
    ) alldates 
    left join 
    (select * from table where Id = '1' and Date > to_date('12/01/2010', 'MM/DD/YYYY') b 
    on alldates.Date = b.Date 
+0

Công trình này đẹp mắt. Cảm ơn! Tôi có thể làm cho nó tạo ra các dấu thời gian chỉ từ 09:30 đến 16:00 không? – Aks

+0

có, bạn nên thực hiện một số thao tác số: đặt ngày bắt đầu lúc 09:30 và tạo số phút cho đến 16:00 :) –

+0

Tuyệt vời! Cảm ơn một tấn! – Aks

Các vấn đề liên quan