Một vấn đề mà tôi thấy ngay là sử dụng kiểu dữ liệu dấu thời gian cho ngày tháng, điều này sẽ làm phức tạp truy vấn sql của bạn vì hai lý do - bạn sẽ phải sử dụng một phạm vi hoặc chuyển đổi thành một ngày thực tế trong mệnh đề where của bạn, nhưng, quan trọng hơn , vì bạn nói rằng bạn quan tâm đến giá đóng cửa của ngày hôm nay và giá đóng cửa của ngày hôm qua, bạn sẽ phải theo dõi những ngày thị trường mở cửa - vì vậy truy vấn của ngày thứ Hai khác với ngày thứ sáu và bất kỳ ngày nào thị trường đóng cửa một kỳ nghỉ cũng sẽ phải được tính đến.
Tôi sẽ thêm một cột như mktDay và tăng nó lên mỗi ngày thị trường mở cửa kinh doanh. Một cách tiếp cận khác có thể là bao gồm cột 'beforeClose', cột này làm cho phép tính của bạn trở nên tầm thường. Tôi nhận thấy điều này vi phạm hình thức bình thường, nhưng nó giúp tiết kiệm một khoản tự tham gia đắt tiền trong truy vấn của bạn.
Nếu bạn không thể thay đổi cấu trúc, thì bạn sẽ tự tham gia để kết thúc ngày hôm qua và bạn có thể tính% thay đổi và đặt hàng theo% thay đổi đó nếu bạn muốn.
Dưới đây là mã của Eric, được làm sạch một chút mà nó được thực thi trên máy chủ của tôi đang chạy mysql 5.0.27
select
p_today.`ticker`,
p_today.`date`,
p_yest.price as `open`,
p_today.price as `close`,
((p_today.price - p_yest.price)/p_yest.price) as `change`
from
prices p_today
inner join prices p_yest on
p_today.ticker = p_yest.ticker
and date(p_today.`date`) = date(p_yest.`date`) + INTERVAL 1 DAY
and p_today.price > 0
and p_yest.price > 0
and date(p_today.`date`) = CURRENT_DATE
order by `change` desc
limit 10
Lưu ý dấu tích vì một số tên cột của bạn và bí danh của Eric là những từ dành riêng.
Cũng lưu ý rằng việc sử dụng mệnh đề where cho bảng đầu tiên sẽ là một truy vấn ít tốn kém hơn - where get được thực thi đầu tiên và chỉ phải cố gắng tự nối trên các hàng lớn hơn 0 và có ngày hôm nay
select
p_today.`ticker`,
p_today.`date`,
p_yest.price as `open`,
p_today.price as `close`,
((p_today.price - p_yest.price)/p_yest.price) as `change`
from
prices p_today
inner join prices p_yest on
p_today.ticker = p_yest.ticker
and date(p_today.`date`) = date(p_yest.`date`) + INTERVAL 1 DAY
and p_yest.price > 0
where p_today.price > 0
and date(p_today.`date`) = CURRENT_DATE
order by `change` desc
limit 10