ฉันมีตารางที่มีคอลัมน์ของค่าทศนิยมเช่นนี้
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
สิ่งที่ฉันต้องทำให้สำเร็จเป็นเรื่องยากที่จะอธิบายดังนั้นโปรดอดทนด้วย สิ่งที่ผมพยายามทำคือการสร้างมูลค่ารวมของsize
คอลัมน์ที่เพิ่มขึ้นโดยที่ 1 ในแต่ละครั้งแถวก่อนหน้านี้รวมถึง 1 value
เมื่อเรียงลำดับตาม ผลลัพธ์จะเป็นดังนี้:
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
ความพยายามครั้งแรกของฉันที่ไร้เดียงสาคือการวิ่งต่อไปSUM
และจากนั้นก็มีCEILING
ค่านั้น แต่มันก็ไม่ได้จัดการกับกรณีที่บางระเบียนsize
จบลงด้วยการมีส่วนร่วมทั้งหมดสองถังแยกกัน ตัวอย่างด้านล่างอาจอธิบายสิ่งนี้:
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
อย่างที่คุณเห็นถ้าฉันจะใช้เพียงแค่CEILING
ในcrude_sum
บันทึก # 8 จะได้รับมอบหมายให้ฝากข้อมูล 2 นี้เกิดจากการsize
บันทึก # 5 และ # 8 ถูกแบ่งออกเป็นสองถัง ทางออกที่ดีที่สุดคือการรีเซ็ตผลรวมทุกครั้งที่มาถึง 1 ซึ่งจะเพิ่มbucket
คอลัมน์และเริ่มการSUM
ดำเนินการใหม่โดยเริ่มจากsize
มูลค่าของระเบียนปัจจุบัน เนื่องจากลำดับของเร็กคอร์ดมีความสำคัญต่อการดำเนินการนี้ฉันจึงรวมvalue
คอลัมน์ซึ่งมีวัตถุประสงค์เพื่อเรียงลำดับจากมากไปน้อย
ความพยายามเริ่มต้นของฉันเกี่ยวข้องกับการส่งผ่านข้อมูลหลายครั้งเพื่อทำการดำเนินSUM
การอีกครั้งไปอีกครั้งCEILING
และนี่คือตัวอย่างของสิ่งที่ฉันทำเพื่อสร้างcrude_sum
คอลัมน์:
SELECT
id,
value,
size,
(SELECT TOP 1 SUM(size) FROM table t2 WHERE t2.value<=t1.value) as crude_sum
FROM
table t1
ซึ่งใช้ในการUPDATE
ดำเนินการเพื่อแทรกค่าลงในตารางเพื่อใช้งานในภายหลัง
แก้ไข: ฉันต้องการที่จะแทงอีกที่อธิบายเรื่องนี้เพื่อไปที่นี่ ลองนึกภาพแต่ละระเบียนเป็นรายการทางกายภาพ รายการนั้นมีค่าที่เกี่ยวข้องและขนาดทางกายภาพน้อยกว่าหนึ่งรายการ ฉันมีชุดของถังที่มีความจุปริมาตรเท่ากับ 1 และฉันต้องกำหนดจำนวนของถังเหล่านี้ที่ฉันจะต้องใช้และที่ฝากข้อมูลแต่ละรายการจะดำเนินการตามมูลค่าของรายการเรียงจากมากไปน้อย
ไอเท็มฟิสิคัลไม่สามารถมีอยู่ในสองแห่งพร้อมกันดังนั้นจึงต้องอยู่ในที่เก็บหนึ่งชุด นี่คือเหตุผลที่ฉันไม่สามารถทำCEILING
โซลูชันรวม + ที่กำลังทำงานอยู่ได้เพราะนั่นจะช่วยให้ระเบียนมีส่วนร่วมในขนาดของพวกเขาเป็นสองถัง
distinct_count
สิ่งที่ซับซ้อน Aaron Bertrand มีข้อมูลสรุปที่ยอดเยี่ยมเกี่ยวกับตัวเลือกของคุณบน SQL Serverสำหรับงานประเภทหน้าต่างนี้ ฉันใช้วิธี "quirky update" เพื่อคำนวณdistinct_sum
ซึ่งคุณสามารถดูได้ที่นี่บน SQL Fiddleแต่นี่ไม่น่าเชื่อถือ