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

Truy vấn SQL để nhận giá mới nhất

Tôi nghĩ giải pháp duy nhất với cấu trúc bảng của bạn là làm việc với một truy vấn con:

SELECT *
   FROM Thing
   WHERE ID IN (SELECT max(ID) FROM Thing 
                   WHERE ThingID IN (1,2,3,4)
                   GROUP BY ThingID)

(Với ID cao nhất cũng có nghĩa là giá mới nhất)

Tuy nhiên, tôi khuyên bạn nên thêm cột "Hiện tại" là 0 nếu đó không phải là giá mới nhất hoặc 1 nếu là giá mới nhất. Điều này sẽ thêm rủi ro có thể xảy ra về dữ liệu không nhất quán, nhưng nó sẽ tăng tốc toàn bộ quá trình lên rất nhiều khi bảng lớn hơn (nếu nó nằm trong một chỉ mục). Sau đó, tất cả những gì bạn cần làm là ...

SELECT *
   FROM Thing
   WHERE ThingID IN (1,2,3,4)
     AND IsCurrent = 1

CẬP NHẬT

Được rồi, Markus đã cập nhật câu hỏi để cho thấy rằng ID là duy nhất, không phải int. Điều đó làm cho việc viết truy vấn trở nên phức tạp hơn.

SELECT T.* 
   FROM Thing T
   JOIN (SELECT ThingID, max(PriceDateTime)
            WHERE ThingID IN (1,2,3,4)
            GROUP BY ThingID) X ON X.ThingID = T.ThingID 
                                AND X.PriceDateTime = T.PriceDateTime
   WHERE ThingID IN (1,2,3,4)

Tôi thực sự khuyên bạn nên sử dụng cột "Hiện tại" hoặc đi với đề xuất khác được tìm thấy trong câu trả lời và sử dụng bảng "giá hiện tại" và bảng "lịch sử giá" riêng biệt (cuối cùng sẽ là bảng nhanh nhất, vì nó giữ nguyên giá bảng nhỏ).

(Tôi biết rằng ThingID ở dưới cùng là dư thừa. Chỉ cần thử xem nó có nhanh hơn khi có hoặc không có "WHERE" đó. Không chắc phiên bản nào sẽ nhanh hơn sau khi trình tối ưu hóa hoạt động.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thay thế đệ quy từ một bảng ký tự

  2. Làm thế nào để thực hiện một truy vấn vòng lặp sql để kiểm tra sự khác biệt giữa các giá trị?

  3. Chèn hàng loạt bằng quy trình được lưu trữ

  4. Cách lấy giá trị tự động tăng của hàng cuối cùng tại phần chèn

  5. Làm cách nào để bạn có được các tìm kiếm toàn văn bằng ký tự đại diện hàng đầu hoạt động trong SQL Server?