Cercando di calcolare l'unità di misura più adatta per un elenco di sostanze in cui le sostanze sono fornite in volumi di unità diversi (ma compatibili).
Tabella di conversione unità
La tabella di conversione delle unità memorizza varie unità e il modo in cui tali unità sono correlate:
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
L'ordinamento per coefficiente mostra che parent_id
collega un'unità figlio al suo superiore numerico.
Questa tabella può essere creata in PostgreSQL usando:
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)
)
Dovrebbe esserci una chiave esterna da parent_id
a id
.
Tabella delle sostanze
La tabella delle sostanze elenca quantità specifiche di sostanze. Per esempio:
id unit label quantity
1 "microlitre" mercury 5
2 "millilitre" water 500
3 "centilitre" water 2
4 "microlitre" mercury 10
5 "millilitre" water 600
La tabella potrebbe assomigliare a:
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)
)
Problema
Come creeresti una query che trova una misura per rappresentare la somma delle sostanze usando il minor numero di cifre che ha un numero intero (e facoltativamente un componente reale)?
Ad esempio, come restituiresti:
quantity unit label
15 microlitre mercury
112 centilitre water
Ma no:
quantity unit label
15 microlitre mercury
1.12 litre water
Perché 112 ha meno cifre reali di 1,12 e 112 è minore di 1120. Tuttavia, in alcune situazioni l'uso di cifre reali è più breve, come 1,1 litri contro 110 centilitri.
Principalmente, ho problemi a scegliere l'unità corretta in base alla relazione ricorsiva.
Codice sorgente
Finora ho (ovviamente non funzionante):
-- Normalize the quantities
select
sum( coefficient * quantity ) AS kilolitres
from
unit_conversion uc,
substance s
where
uc.unit = s.unit
group by
s.label
idee
Ciò richiede l'utilizzo del registro 10 per determinare il numero di cifre?
vincoli
Le unità non hanno tutti un potere di dieci. Ad esempio: http://unitsofmeasure.org/ucum-essence.xml