Dưới đây là một giải pháp MySQL:
UPDATE mytable
SET number = (@n := COALESCE(number, @n))
ORDER BY date;
Đây là súc tích, nhưng sẽ không cần thiết trong các thương hiệu khác của RDBMS. Đối với các thương hiệu khác, có thể có giải pháp dành riêng cho thương hiệu có liên quan hơn. Đó là lý do tại sao điều quan trọng là phải cho chúng tôi biết thương hiệu bạn đang sử dụng.
Thật tuyệt khi được nhà cung cấp độc lập, như @Pax đã nhận xét, nhưng thất bại, bạn cũng nên sử dụng thương hiệu cơ sở dữ liệu đã chọn của mình để tận dụng tối đa lợi thế của nó.
Giải thích về các truy vấn trên:
@n
là một biến sử dụng MySQL. Nó bắt đầu ra NULL, và được gán một giá trị trên mỗi hàng khi UPDATE chạy qua các hàng. Trong đó number
không phải là NULL, @n
được gán giá trị là number
. Trường hợp number
là NULL, thì COALESCE()
mặc định là giá trị trước đó là @n
. Trong cả hai trường hợp, giá trị này sẽ trở thành giá trị mới của cột number
và UPDATE tiếp tục đến hàng tiếp theo. Biến số @n
vẫn giữ giá trị của nó từ hàng này sang hàng khác, do đó các hàng tiếp theo nhận được các giá trị đến từ (các) hàng trước đó. Thứ tự của UPDATE có thể dự đoán được, vì việc sử dụng đặc biệt của ORDER BY với UPDATE của MySQL (đây không phải là SQL chuẩn).
Nguồn
2009-08-28 06:01:04
Bạn có thể vui lòng xác định nhãn hiệu cơ sở dữ liệu SQL bạn đang sử dụng hay không, ví dụ: MySQL, Oracle, SQL-Server và chỉnh sửa câu hỏi của bạn để thêm thẻ đó? –
Bạn có nghĩa là ngày ở hàng trước đó hoặc ngày trước đó (ngày -1) không? Có lẽ đưa ra một ví dụ về dữ liệu mà bạn có trong các cột và một ví dụ về đầu ra mà bạn mong muốn. – Degan
@Bill, anh ta có thể muốn một giải pháp chung chung. Một số người trong chúng ta thực sự * thích * khả năng chuyển đổi dễ dàng giữa DBMS 'khi họ trở thành PITA :-) Tuy nhiên, rất khó (có thể là không thể) để làm điều này trong SQL chuẩn, @mike, vì vậy nếu bạn có một DBMS cụ thể trong tâm trí, bằng mọi cách cho chúng tôi biết. – paxdiablo