Tìm cách tính đơn vị đo lường phù hợp nhất cho danh sách các chất trong đó các chất được cho theo khối lượng đơn vị khác nhau (nhưng tương thích).
Bảng chuyển đổi đơn vị
Bảng chuyển đổi đơn vị lưu trữ các đơn vị khác nhau và cách các đơn vị đó liên quan:
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
Sắp xếp theo hệ số cho thấy rằng parent_id
liên kết một đơn vị con với cấp trên số của nó.
Bảng này có thể được tạo trong PostgreSQL bằng cách sử dụng:
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)
)
Cần có một khóa ngoại từ parent_id
đến id
.
Bảng chất
Bảng Chất liệt kê số lượng cụ thể của các chất. Ví dụ:
id unit label quantity
1 "microlitre" mercury 5
2 "millilitre" water 500
3 "centilitre" water 2
4 "microlitre" mercury 10
5 "millilitre" water 600
Bảng có thể giống:
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)
)
Vấn đề
Làm thế nào bạn có thể tạo một truy vấn tìm thấy một phép đo để biểu thị tổng của các chất bằng cách sử dụng ít chữ số nhất có toàn bộ số (và thành phần thực tùy chọn)?
Ví dụ: bạn sẽ trở về như thế nào:
quantity unit label
15 microlitre mercury
112 centilitre water
Nhưng không:
quantity unit label
15 microlitre mercury
1.12 litre water
Bởi vì 112 có ít chữ số thực hơn 1,12 và 112 nhỏ hơn 1120. Tuy nhiên, trong một số trường hợp, sử dụng chữ số thực ngắn hơn - chẳng hạn như 1,1 lít so với 110 centilit.
Hầu hết, tôi gặp khó khăn khi chọn đơn vị chính xác dựa trên mối quan hệ đệ quy.
Mã nguồn
Cho đến nay tôi có (rõ ràng là không làm việc):
-- Normalize the quantities
select
sum( coefficient * quantity ) AS kilolitres
from
unit_conversion uc,
substance s
where
uc.unit = s.unit
group by
s.label
Ý tưởng
Điều này có yêu cầu sử dụng log 10 để xác định số chữ số không?
Những ràng buộc
Các đơn vị không phải là tất cả trong quyền hạn của mười. Ví dụ: http://unitsofmeasure.org/ucum-essence.xml