Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để tính% thay đổi giá hàng ngày hàng đầu bằng MySQL?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng Pentaho Kettle, làm cách nào để tải nhiều bảng từ một bảng trong khi vẫn giữ được tính toàn vẹn của tham chiếu?

  2. Mối quan hệ 1-1 liên quan đến nhiều bảng

  3. MySQL sao chép một người dùng

  4. Trình kết nối MySQL cho Python

  5. tiêu đề bảng lặp lại từ một vòng lặp for trong php