寻找一种最合适的计量单位清单,列出以不同(但兼容)单位体积给出的物质。
单位换算表
单位转换表存储各种单位以及这些单位之间的关系:
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的实数少于1120。但是在某些情况下,使用实数的数更短-例如1.1升对110厘升。
通常,我很难根据递归关系选择正确的单位。
源代码
到目前为止,我(显然无法正常工作):
-- Normalize the quantities
select
sum( coefficient * quantity ) AS kilolitres
from
unit_conversion uc,
substance s
where
uc.unit = s.unit
group by
s.label
主意
这是否需要使用日志10来确定位数?
约束条件
单位并非全部具有十的幂。例如:http : //unitsofmeasure.org/ucum-essence.xml
3
@mustaccio我在以前的生产系统上也遇到过同样的问题。在那里,我们必须计算送餐厨房中使用的数量。
—
dezso 2013年
我记得至少有两级递归CTE。我想我首先用给定物质在列表中出现的最小单位求和,然后将其转换为仍具有非零整数部分的最大单位。
—
dezso 2013年
所有单位都能用10的幂转换吗?您的单位清单是否完整?
—
Erwin Brandstetter