물질이 다른 (그러나 호환되는) 단위 부피로 제공되는 물질 목록에 대해 가장 적합한 측정 단위를 계산하려고합니다.
단위 변환 표
단위 변환 표는 다양한 단위와 해당 단위의 관계를 저장합니다.
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