Tôi có một bảng bao gồm một cột các giá trị thập phân, chẳng hạn như:
id value size
-- ----- ----
1 100 .02
2 99 .38
3 98 .13
4 97 .35
5 96 .15
6 95 .57
7 94 .25
8 93 .15
Những gì tôi cần phải hoàn thành là một chút khó khăn để mô tả, vì vậy xin vui lòng chịu đựng với tôi. Những gì tôi đang cố gắng làm là tạo một giá trị tổng hợp của size
cột tăng 1 mỗi lần các hàng trước tổng hợp thành 1, khi theo thứ tự giảm dần theo value
. Kết quả sẽ trông giống như thế này:
id value size bucket
-- ----- ---- ------
1 100 .02 1
2 99 .38 1
3 98 .13 1
4 97 .35 1
5 96 .15 2
6 95 .57 2
7 94 .25 2
8 93 .15 3
Nỗ lực đầu tiên ngây thơ của tôi là tiếp tục chạy SUM
và sau đó CEILING
là giá trị đó, tuy nhiên nó không xử lý trường hợp một số hồ sơ size
cuối cùng đóng góp vào tổng số hai thùng riêng biệt. Ví dụ dưới đây có thể làm rõ điều này:
id value size crude_sum crude_bucket distinct_sum bucket
-- ----- ---- --------- ------------ ------------ ------
1 100 .02 .02 1 .02 1
2 99 .38 .40 1 .40 1
3 98 .13 .53 1 .53 1
4 97 .35 .88 1 .88 1
5 96 .15 1.03 2 .15 2
6 95 .57 1.60 2 .72 2
7 94 .25 1.85 2 .97 2
8 93 .15 2.00 2 .15 3
Như bạn có thể thấy, nếu tôi chỉ đơn giản sử dụng CEILING
trong crude_sum
bản ghi số 8 thì sẽ được gán cho nhóm 2. Điều này xảy ra do các size
bản ghi số 5 và số 8 bị chia thành hai nhóm. Thay vào đó, giải pháp lý tưởng là đặt lại tổng mỗi lần đạt 1, sau đó tăng bucket
cột và bắt đầu một SUM
thao tác mới bắt đầu từ size
giá trị của bản ghi hiện tại. Vì thứ tự của các bản ghi rất quan trọng đối với thao tác này, tôi đã bao gồm value
cột, được dự định sắp xếp theo thứ tự giảm dần.
Những nỗ lực ban đầu của tôi đã liên quan đến việc thực hiện nhiều lần truyền dữ liệu, một lần để thực hiện SUM
thao tác, một lần nữa cho CEILING
điều đó, v.v ... Dưới đây là một ví dụ về những gì tôi đã làm để tạo crude_sum
cột:
SELECT
id,
value,
size,
(SELECT TOP 1 SUM(size) FROM table t2 WHERE t2.value<=t1.value) as crude_sum
FROM
table t1
Mà đã được sử dụng trong một UPDATE
hoạt động để chèn giá trị vào một bảng để làm việc sau này.
Chỉnh sửa: Tôi muốn thực hiện một cú đâm khác để giải thích điều này, vì vậy hãy đến đây. Hãy tưởng tượng mỗi bản ghi là một mục vật lý. Mục đó có giá trị liên quan đến nó và kích thước vật lý nhỏ hơn một. Tôi có một loạt các thùng có dung tích chính xác là 1, và tôi cần xác định mình sẽ cần bao nhiêu thùng và mỗi thùng sẽ đi theo giá trị của vật phẩm, được sắp xếp từ cao nhất đến thấp nhất.
Một vật phẩm vật lý không thể tồn tại ở hai nơi cùng một lúc, vì vậy nó phải ở trong một thùng này hoặc thùng kia. Đây là lý do tại sao tôi không thể thực hiện CEILING
giải pháp tổng + đang chạy , vì điều đó sẽ cho phép các bản ghi đóng góp kích thước của chúng vào hai nhóm.
distinct_count
những điều phức tạp. Aaron Bertrand có một bản tóm tắt tuyệt vời về các tùy chọn của bạn trên SQL Server cho loại công việc cửa sổ này. Tôi đã sử dụng phương pháp "cập nhật kỳ quặc" để tính toán distinct_sum
, mà bạn có thể thấy ở đây trên SQL Fiddle , nhưng điều này không đáng tin cậy.