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 sizecộ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 SUMvà sau đó CEILINGlà giá trị đó, tuy nhiên nó không xử lý trường hợp một số hồ sơ sizecuố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 CEILINGtrong crude_sumbản ghi số 8 thì sẽ được gán cho nhóm 2. Điều này xảy ra do các sizebả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 bucketcột và bắt đầu một SUMthao tác mới bắt đầu từ sizegiá 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 valuecộ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 SUMthao 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_sumcộ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 UPDATEhoạ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 CEILINGgiả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_countnhữ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.