Maddelerin farklı (ancak uyumlu) birim hacimlerde verildiği bir madde listesi için en uygun ölçü birimini hesaplamak isteyen.
Birim Dönüşüm Tablosu
Birim dönüşüm tablosu çeşitli birimleri ve bu birimlerin nasıl bir ilişki içerdiğini depolar:
id unit coefficient parent_id
36 "microlitre" 0.0000000010000000000000000 37
37 "millilitre" 0.0000010000000000000000000 5
5 "centilitre" 0.0000100000000000000000000 18
18 "decilitre" 0.0001000000000000000000000 34
34 "litre" 0.0010000000000000000000000 19
19 "dekalitre" 0.0100000000000000000000000 29
29 "hectolitre" 0.1000000000000000000000000 33
33 "kilolitre" 1.0000000000000000000000000 35
35 "megalitre" 1000.0000000000000000000000 0
Katsayıya göre sıralama, parent_id
bir alt birimi sayısal üst noktasına bağladığını gösterir .
Bu tablo PostgreSQL'de şunlar kullanılarak oluşturulabilir:
CREATE TABLE unit_conversion (
id serial NOT NULL, -- Primary key.
unit text NOT NULL, -- Unit of measurement name.
coefficient numeric(30,25) NOT NULL DEFAULT 0, -- Conversion value.
parent_id integer NOT NULL DEFAULT 0, -- Relates units in order of increasing measurement volume.
CONSTRAINT pk_unit_conversion PRIMARY KEY (id)
)
Bir yabancı anahtar olmalıdır parent_id
için id
.
Madde Tablosu
Madde Tablosu belirli miktarlarda maddeyi listeler. Örneğin:
id unit label quantity
1 "microlitre" mercury 5
2 "millilitre" water 500
3 "centilitre" water 2
4 "microlitre" mercury 10
5 "millilitre" water 600
Tablo aşağıdakine benzeyebilir:
CREATE TABLE substance (
id bigserial NOT NULL, -- Uniquely identifies this row.
unit text NOT NULL, -- Foreign key to unit conversion.
label text NOT NULL, -- Name of the substance.
quantity numeric( 10, 4 ) NOT NULL, -- Amount of the substance.
CONSTRAINT pk_substance PRIMARY KEY (id)
)
Sorun
Tam sayıya (ve isteğe bağlı olarak gerçek bileşene) sahip en az haneyi kullanan maddelerin toplamını temsil eden bir ölçüm bulan bir sorguyu nasıl oluşturabilirsiniz?
Örneğin, nasıl geri dönersiniz?
quantity unit label
15 microlitre mercury
112 centilitre water
Ama değil:
quantity unit label
15 microlitre mercury
1.12 litre water
Çünkü 112, 1.12'den daha az gerçek basamağa sahiptir ve 112, 1120'den daha küçüktür. Ancak, bazı durumlarda gerçek rakamların kullanılması daha kısadır - 1.1 litre ve 110 centilitre gibi.
Çoğunlukla, özyinelemeli ilişkiye dayalı olarak doğru birimi seçmede sorunlar yaşıyorum.
Kaynak kodu
Şimdiye kadar (açıkçası çalışmayan) var:
-- Normalize the quantities
select
sum( coefficient * quantity ) AS kilolitres
from
unit_conversion uc,
substance s
where
uc.unit = s.unit
group by
s.label
fikirler
Bu basamak sayısını belirlemek için log 10 kullanılmasını gerektirir mi?
Kısıtlamalar
Birimlerin hepsi on kişilik değil. Örneğin: http://unitsofmeasure.org/ucum-essence.xml