Bu gibi ondalık değerler sütunu içeren bir tablo var:
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
Yapmam gereken şeyi anlatmak biraz zor, bu yüzden lütfen bana katlan. Ne yapmaya çalışıyorum size
önceki satır 1'e göre her seferinde 1, her biri göre azalan sırada zaman 1 artar sütun toplam değeri oluşturmaktır value
. Sonuç şöyle görünecektir:
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
Naif ilk denemem bir koşuyu SUM
ve ardından CEILING
bu değeri korumaktı , ancak bazı kayıtların size
toplamda iki ayrı kovaya katkıda bulunduğu durumla ilgilenmiyor . Aşağıdaki örnek bunu açıklığa kavuşturabilir:
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
Gördüğünüz gibi ben sadece kullanmak olsaydı, CEILING
üzerinde crude_sum
kayda 8. Bu kaynaklanır kovaya 2. tayin edileceğini size
iki kova genelinde kayıtların 5. ve 8. olmanın bölünmüş. Bunun yerine, ideal çözüm, 1'e her ulaştığında toplamı sıfırlamaktır, bu daha sonra bucket
sütunu arttırır ve geçerli kaydın değerinden SUM
başlayarak yeni bir işlem başlatır size
. Kayıtların sırası bu işlem için önemli olduğundan value
, azalan sırada sıralanması amaçlanan sütunu ekledim.
İlk denemelerim, bir kez SUM
işlemi gerçekleştirmek için bir kez daha veri vb. Üzerinde birden fazla geçiş yapmayı içeriyordu CEILING
. İşte crude_sum
sütun oluşturmak için yaptığımın bir örneği :
SELECT
id,
value,
size,
(SELECT TOP 1 SUM(size) FROM table t2 WHERE t2.value<=t1.value) as crude_sum
FROM
table t1
Hangi bir UPDATE
işlemde daha sonra çalışmak için bir tabloya değer eklemek için kullanıldı .
Düzenleme: Bunu açıklamak için başka bir bıçak almak istiyorum, işte gidiyor. Her kaydın fiziksel bir öğe olduğunu düşünün. Bu öğenin kendisiyle ilişkilendirilmiş bir değeri ve birden fazla fiziksel boyutu var. Hacim kapasitesi tam olarak 1 olan bir dizi kova var ve bu kovalardan kaçına ihtiyacım olacağını ve her bir öğenin en yüksekten en alta doğru sıralanan öğenin değerine göre gittiğini belirlemem gerekiyor.
Fiziksel bir öğe aynı anda iki yerde bulunamaz, bu nedenle bir kovada veya diğerinde olmalıdır. Bu yüzden çalışan bir toplam + CEILING
çözüm yapamıyorum , çünkü bu kayıtların boyutlarını iki kepçeye katkıda bulunmasına izin verecek.
distinct_count
işleri karmaşıklaştırır. Aaron Bertrand, bu tür pencereleme çalışmaları için SQL Server'daki seçeneklerinizin harika bir özetine sahiptir . SQL Fiddle'dadistinct_sum
görebileceğiniz hesaplamak için "ilginç güncelleme" yöntemini kullandım , ancak bu güvenilir değil.