กำลังมองหาการคำนวณหน่วยการวัดที่เหมาะสมที่สุดสำหรับรายการของสารที่ให้สารในปริมาณหน่วยที่แตกต่างกัน (แต่เข้ากันได้)
ตารางการแปลงหน่วย
ตารางแปลงหน่วยจัดเก็บหน่วยต่าง ๆ และความเกี่ยวข้องของหน่วยเหล่านั้น:
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
การเรียงลำดับตามค่าสัมประสิทธิ์แสดงให้เห็นว่าการparent_id
เชื่อมโยงหน่วยรองกับตัวเลขที่เหนือกว่า
ตารางนี้สามารถสร้างได้ใน PostgreSQL โดยใช้:
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)
)
ควรจะมีต่างประเทศที่สำคัญจากการparent_id
id
ตารางสาร
ตารางสารแสดงปริมาณสารเฉพาะ ตัวอย่างเช่น:
id unit label quantity
1 "microlitre" mercury 5
2 "millilitre" water 500
3 "centilitre" water 2
4 "microlitre" mercury 10
5 "millilitre" water 600
ตารางอาจมีลักษณะ:
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)
)
ปัญหา
คุณจะสร้างแบบสอบถามที่ค้นหาการวัดเพื่อแสดงผลรวมของสารโดยใช้ตัวเลขที่น้อยที่สุดที่มีจำนวนเต็ม (และส่วนประกอบที่เป็นทางเลือกจริง) ได้อย่างไร
ตัวอย่างเช่นคุณจะกลับมาอย่างไร:
quantity unit label
15 microlitre mercury
112 centilitre water
แต่ไม่:
quantity unit label
15 microlitre mercury
1.12 litre water
เนื่องจาก 112 มีตัวเลขจริงน้อยกว่า 1.12 และ 112 มีขนาดเล็กกว่า 1,120 แต่ในบางสถานการณ์การใช้ตัวเลขจริงจะสั้นกว่าเช่น 1.1 ลิตรเทียบกับ 110 centilitres
ส่วนใหญ่ฉันมีปัญหาในการเลือกหน่วยที่ถูกต้องตามความสัมพันธ์แบบเรียกซ้ำ
รหัสแหล่งที่มา
จนถึงตอนนี้ฉันมี (เห็นได้ชัดว่าไม่ทำงาน):
-- Normalize the quantities
select
sum( coefficient * quantity ) AS kilolitres
from
unit_conversion uc,
substance s
where
uc.unit = s.unit
group by
s.label
ไอเดีย
จำเป็นต้องใช้ log 10เพื่อกำหนดจำนวนหลักหรือไม่
ข้อ จำกัด
หน่วยไม่ได้อยู่ในอำนาจของสิบ ตัวอย่างเช่น: http://unitsofmeasure.org/ucum-essence.xml