物質が異なる(ただし互換性のある)単位体積で与えられている物質のリストに最も適した測定単位を計算しようとしています。
単位換算表
単位変換テーブルには、さまざまな単位とそれらの単位の関係が格納されています。
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を使用する必要がありますか?
制約
ユニットはすべて10の累乗ではありません。例:http : //unitsofmeasure.org/ucum-essence.xml