Thread: multiple paramters in aggregate function

multiple paramters in aggregate function

From
Sim Zacks
Date:
According to the documentation, you can pass multiple parameters into an
aggregate function, but it only stores one value.


What I am trying to do is sum a quantity field, but it also has units
that need to be converted.

My function should take 2 values, the quantity and the unit, determine
which unit to use, the one in state or the passed in one and to convert
either the quantity in state or the quantity passed in and add it to the
other quantity.

In other words:

4 meter

400 mm

100 cm


I want to sum it all, my function decides to use meter (based on the
requirements) and should return 4.00104 (or something like that) and
then I have a second aggregate function which just chooses which unit to
use, so in my query I use 2 aggregate functions, one gives me the sum of
converted quantity and the other gives me which unit it is in.


Currently, the only way I can think of doing this is by keeping an array
in state.

Is there a better way?


Thank you

Sim


R: multiple paramters in aggregate function

From
Scara Maccai
Date:
> Is there a better way?

I think you could use a User Data Type.
Then pass that as parameter to your aggregate function.

That is: you would pass

(4, 'meter')

(400,  'mm')

(100, 'cm')

to your aggregate function.

Each one is a user datatype:

CREATE TYPE mytype AS (
    v       double precision,
    t       varchar(10)
);

See

http://www.postgresql.org/docs/8.4/static/rowtypes.html

This is the example based on a custom data type of complex numbers:

http://www.postgresql.org/docs/8.4/static/xaggr.html





Re: multiple paramters in aggregate function

From
Alban Hertroys
Date:
On 13 Aug 2009, at 12:51, Sim Zacks wrote:

> What I am trying to do is sum a quantity field, but it also has units
> that need to be converted.

> 4 meter
>
> 400 mm
>
> 100 cm
>
>
> I want to sum it all, my function decides to use meter (based on the
> requirements) and should return 4.00104 (or something like that) and
> then I have a second aggregate function which just chooses which
> unit to
> use, so in my query I use 2 aggregate functions, one gives me the
> sum of
> converted quantity and the other gives me which unit it is in.

> Is there a better way?

It's probably easiest to decide on an internal unit to use in your
aggregate and only convert it to the desired unit once you're done
summing them. I'd probably convert all measurements to mm in the
function and summarise those.

The final unit conversion can be taken out of the aggregate that way
too, so I'd also have separate functions for converting units to and
from other units - those functions will likely come in handy anyway.

Your query would then be something like:
SELECT convert_unit(sum_mm(field), 'mm', 'meter') FROM table;

In general, don't put multiple operations in one function but split
them into separate functions. You're much more flexible that way.

Alban Hertroys

--
Screwing up is the correct approach to attaching something to the
ceiling.


!DSPAM:737,4a83fca210137297812668!



Re: multiple paramters in aggregate function

From
Sim Zacks
Date:
> It's probably easiest to decide on an internal unit to use in your
> aggregate and only convert it to the desired unit once you're done
> summing them. I'd probably convert all measurements to mm in the
> function and summarise those.
That could work in some cases, however in our case it would not produce
desirable results. If the user put in meters, he is expecting to see
meters. My problem comes in only when the user put in values in multiple
unit types, which does not happen very often. It is generally a mistake,
but we would prefer to let them make the mistake and then see an
irrational result and correcting it, rather then telling them they
probably made a mistake.

I think Scara's solution makes the most sense. It is slightly cleaner
then using an array and comes up with the same result.

Sim

Re: multiple paramters in aggregate function

From
Scara Maccai
Date:
> That could work in some cases, however in our case it would
> not produce
> desirable results.

Well I don't think you got Alban's suggestion right...
What he was trying to say was:

- use a regular (not aggregated) function to convert all measures to mm
- use the normal SUM() to sum those value
- use another regular function to convert from mm to whatever

select mm_to_m(sum(convert_to_mm(measure))) from a

Which is easier than my solution.







Re: multiple paramters in aggregate function

From
Alvaro Herrera
Date:
Sim Zacks wrote:
> According to the documentation, you can pass multiple parameters into an
> aggregate function, but it only stores one value.
>
>
> What I am trying to do is sum a quantity field, but it also has units
> that need to be converted.

Have you seen Martijn van Oosterhout's tagged types?

http://svana.org/kleptog/pgsql/taggedtypes.html

--
Alvaro Herrera                                http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

Re: multiple paramters in aggregate function

From
Sim Zacks
Date:
That would be true if all units were always convertible to mm, but we
have volume also, we also have feet etc.. So that the easiest and
cleanest thing to do, with out having to throw the all the functions
into a case statement is an aggregate function that takes the 2 unit
types and then gives back a result.


> Well I don't think you got Alban's suggestion right...
> What he was trying to say was:
>
> - use a regular (not aggregated) function to convert all measures to mm
> - use the normal SUM() to sum those value
> - use another regular function to convert from mm to whatever
>
> select mm_to_m(sum(convert_to_mm(measure))) from a
>
> Which is easier than my solution


Re: multiple paramters in aggregate function

From
Alban Hertroys
Date:
On 18 Aug 2009, at 6:51, Sim Zacks wrote:

> That would be true if all units were always convertible to mm, but we
> have volume also, we also have feet etc.. So that the easiest and

How did you plan on solving that in your multiple-argument aggregate?
Fake their value by adding 0? That's no different for my suggested
solution.

> cleanest thing to do, with out having to throw the all the functions
> into a case statement is an aggregate function that takes the 2 unit
> types and then gives back a result.

I won't try to force something on you, it's your project after all,
but I think you're still seeing only part of the picture I was trying
to show you.

You have a table with quantities in different units, and you want to
summarise those. If you do that with old-fashioned pen & paper the
first thing you do is convert all your quantities to the same unit so
that you can add them properly. That's basic math.

In this case however we have far better tools, namely a computer with
a database. It's easy to create a table with units and their
conversion factor to a standard unit. If you go a bit further you'd
create a few tables linking units and how to convert them to each
other, which also solves the case where you're not dealing with just
distances (the volumes you mention above, for example).

Once you have that, it's easy to write a few (immutable!) functions:
- convert_to(quantity, unit), which converts a quantity in a given
unit to a standard unit, and
- convert_from(quantity, unit), which converts a quantity in your
standard unit to the given unit.

Then you simply write your query as:
SELECT convert_from(SUM(convert_to(quantity, unit)), 'inch') FROM table;

If you're going for the more complicated approach that can directly
convert any unit to any other (provided the record that links them
exists) the query gets even simpler. You only need one conversion
function in that case:
- convert_unit(quantity, from_unit, to_unit)
and your query would become:
SELECT SUM(convert_unit(quantity, unit, 'inch')) FROM table;

If you're worried about accuracy; the different unit styles have fixed
conversion factors with a finite accuracy. For example; 1 inch is
25.40 mm - that's accurate. If you take their accuracy into account
when defining your quantity columns/variables you won't get any
rounding errors caused by the unit conversion.

Considering you're using at least one of those functions in an
aggregate it's probably worth implementing them in C instead of for
example pl/pgsql, but the latter is easier to test the concept.

And you get the added bonus of being able to convert units anywhere
you like. If you have customers who prefer seeing their quantities
measured in imperial units
and customers preferring standard units you can serve them both. It
adds value to your project; You may recall a recent space probe that
went off in the wrong direction because it had a mix of imperial and
standard units used in its design and someone somewhere forgot to
correct for that in a piece of software...

In fact, having these tables and functions available would be useful
to many people. It would make a great pgfoundry project I think.

>
>
>> Well I don't think you got Alban's suggestion right...
>> What he was trying to say was:
>>
>> - use a regular (not aggregated) function to convert all measures
>> to mm
>> - use the normal SUM() to sum those value
>> - use another regular function to convert from mm to whatever
>>
>> select mm_to_m(sum(convert_to_mm(measure))) from a
>>
>> Which is easier than my solution
>
>
> --
> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general
>
>
>
>

Alban Hertroys

--
Screwing up is the correct approach to attaching something to the
ceiling.


!DSPAM:737,4a8a8ee410137968484637!



Re: Unit conversion database (was: multiple paramters in aggregate function)

From
Alban Hertroys
Date:
Hello all,

Inspired by the original discussion on aggregating quantities of
different units I made a start at a unit conversion database and the
result is here: http://solfertje.student.utwente.nl/documents/units.sql

This is not a complete implementation, I just thought I'd show you
what I got so far and hope you have some ideas about a few problems
I'm facing.

What it can do is convert a bunch of units to and fro, including to
the same unit, using a conversion factor and a pair of offsets to
adjust for zero-point differences (°C to °F or K for example).
By default it installs itself in a schema named 'units'. At the end of
the script is a query that converts '23' (which happened to be the
temperature here while I was testing) from every known unit to every
other known unit. That's meant as a test, but it also makes verifying
correctness fairly easy.

Problem areas are:
- It doesn't contain every possible conversion yet.
Some units are probably just plain wrong too. I don't know every unit
in the list, that's why. I'm especially unfamiliar with imperial units
and some of the more esoteric units. Corrections and additions are
welcome.

- It can't handle unit scaling yet ('mm' to 'm' for example).
There are some units in there that are scaled by default ('kg' is the
standard unit for mass and not 'g'), and some units seem to be not
scalable at all (ever heard of 'mK' - 'milliKelvin'?). This may be
solved by adding a base_scale column which could be NULL if not
applicable.

- Some units are combinations of multiple base-units that would
require parsing the combined unit to determine how to scale or convert
parts of it. I haven't found a good way of handling that yet, maybe I
just shouldn't... I have a feeling that at the very least parsing
units should only happen if the unit isn't a base-unit, which can
simply be flagged.

The latter two issues seem to require a unit parser, which seems a bit
heavy-weight. Or I should just drop all the combined units and only
deal with base-units. Suggestions or even code are welcome.

On 18 Aug 2009, at 13:22, Alban Hertroys wrote:

> In this case however we have far better tools, namely a computer
> with a database. It's easy to create a table with units and their
> conversion factor to a standard unit. If you go a bit further you'd
> create a few tables linking units and how to convert them to each
> other, which also solves the case where you're not dealing with just
> distances (the volumes you mention above, for example).
>
> Once you have that, it's easy to write a few (immutable!) functions:
> - convert_to(quantity, unit), which converts a quantity in a given
> unit to a standard unit, and
> - convert_from(quantity, unit), which converts a quantity in your
> standard unit to the given unit.
>
> Then you simply write your query as:
> SELECT convert_from(SUM(convert_to(quantity, unit)), 'inch') FROM
> table;
>
> If you're going for the more complicated approach that can directly
> convert any unit to any other (provided the record that links them
> exists) the query gets even simpler. You only need one conversion
> function in that case:
> - convert_unit(quantity, from_unit, to_unit)
> and your query would become:
> SELECT SUM(convert_unit(quantity, unit, 'inch')) FROM table;

Alban Hertroys

--
Screwing up is the correct approach to attaching something to the
ceiling.


!DSPAM:737,4a8aec0910131445318212!



Re: Unit conversion database (was: multiple paramters in aggregate function)

From
Alban Hertroys
Date:
On 18 Aug 2009, at 19:59, Alban Hertroys wrote:

> Hello all,
>
> Inspired by the original discussion on aggregating quantities of
> different units I made a start at a unit conversion database and the
> result is here: http://solfertje.student.utwente.nl/documents/units.sql

I just uploaded an updated version that handles scaling of units
properly for at least the base-units. For example:

development=> select convert_unit(28, '°C', '°F');
       convert_unit
-------------------------
  82.39999999999999999960
(1 row)

development=> select convert_unit(28, 'mg', 'gr');
       convert_unit
------------------------
  0.43210603388236005822
(1 row)

development=> select convert_unit(28, 'lb', 'kg');
     convert_unit
---------------------
  10.4507682048000000
(1 row)

development=> select convert_unit(28, 'kg', 'lb');
     convert_unit
---------------------
  75.0184086601319546
(1 row)

development=> select convert_unit(28, 'dm', 'mm');
      convert_unit
-----------------------
  2800.0000000000000000
(1 row)

> Problem areas are:
> - It doesn't contain every possible conversion yet.
> Some units are probably just plain wrong too. I don't know every
> unit in the list, that's why. I'm especially unfamiliar with
> imperial units and some of the more esoteric units. Corrections and
> additions are welcome.

I added several units from http://en.wikipedia.org/wiki/Conversion_of_units
  (my original source was Binas, an old book I had left over from high-
school days). Imperial units should be more complete now.
Still, if you notice any obvious errors or omissions, let me know.

> - It can't handle unit scaling yet ('mm' to 'm' for example).
> There are some units in there that are scaled by default ('kg' is
> the standard unit for mass and not 'g'), and some units seem to be
> not scalable at all (ever heard of 'mK' - 'milliKelvin'?). This may
> be solved by adding a base_scale column which could be NULL if not
> applicable.

This is working now.

> - Some units are combinations of multiple base-units that would
> require parsing the combined unit to determine how to scale or
> convert parts of it. I haven't found a good way of handling that
> yet, maybe I just shouldn't... I have a feeling that at the very
> least parsing units should only happen if the unit isn't a base-
> unit, which can simply be flagged.

These are flagged now, but that's about it. No conversions for such
units have been entered yet.
One change is that the formatting of the units has changed to
something less likely to give ambiguous results (eg. 'ms-1' has been
changed to 'm.s^-1').

I think this database is fairly usable in its current state. Any more
development on it warrants its own project page somewhere and taking
it off-list, I'll no longer pester you with updates on this ;)

Have a nice day!

Alban Hertroys

--
Screwing up is the correct approach to attaching something to the
ceiling.


!DSPAM:737,4a8c220b10137643883901!



Re: Unit conversion database (was: multiple paramters in aggregate function)

From
"Karsten Hilbert"
Date:
Alban,

I think having an installable schema for units of measure with
definitions and functions would be a great addition to PostgreSQL.

I for one know we would use it in GNUmed (wiki.gnumed.de).

A few points:

Would these guys be of use as a source for reference data ?

   http://unitsofmeasure.org/

You may want to think about whether there's use in combining
units with tagged types:

   http://svana.org/kleptog/pgsql/taggedtypes.html

There's also a Debian package which comes with a text format
units database:

   http://packages.debian.org/source/sid/units

The original source for that:

 This package was put together by me, James Troup <james@nocrew.org>,
 from the GNU sources, which I obtained from
 sunsite.doc.ic.ac.uk:/pub/gnu/units-1.54.tar.gz.

 The current version of the package was obtained from
 ftp://ftp.gnu.org/gnu/units
 by John Hasler, the current Debian maintainer.

> I think this database is fairly usable in its current state. Any more
> development on it

Yes please ! :-)

> warrants its own project page somewhere and taking
> it off-list, I'll no longer pester you with updates on this ;)

Ah, no problem. Please keep posting release announcements. Maybe
on -announce if so.

Karsten
--
Jetzt kostenlos herunterladen: Internet Explorer 8 und Mozilla Firefox 3 -
sicherer, schneller und einfacher! http://portal.gmx.net/de/go/chbrowser

Re: Unit conversion database (was: multiple paramters in aggregate function)

From
Alban Hertroys
Date:
On 19 Aug 2009, at 19:20, Karsten Hilbert wrote:

> Alban,
>
> I think having an installable schema for units of measure with
> definitions and functions would be a great addition to PostgreSQL.

Karsten,

Thanks for the praise and the links.

> I for one know we would use it in GNUmed (wiki.gnumed.de).
>
> A few points:
>
> Would these guys be of use as a source for reference data ?
>
>   http://unitsofmeasure.org/

That looks certainly interesting, especially the fact that they
provide a source of units and conversions in an XML format. Although
their conversion formulas don't look all that easy to parse.

I've run into a few of the problems they mention already; for example
the slight differences between imperial and US units of measurement
with the same names and abbreviations...

> You may want to think about whether there's use in combining
> units with tagged types:
>
>   http://svana.org/kleptog/pgsql/taggedtypes.html

Yes, I've been thinking the same thing. I had it bookmarked already
for the very purpose of checking it out and see how I could use tagged
types with units.

> There's also a Debian package which comes with a text format
> units database:
>
>   http://packages.debian.org/source/sid/units
>
> The original source for that:
>
> This package was put together by me, James Troup <james@nocrew.org>,
> from the GNU sources, which I obtained from
> sunsite.doc.ic.ac.uk:/pub/gnu/units-1.54.tar.gz.

I don't consider that tool very reliable[1]. A number of their
concepts are probably usable though. I have it's source in my source
tree (FreeBSD), so ample opportunity to peek.

[1] It doesn't correctly convert °C to °F or vv, that was one of the
first things I tried.

> The current version of the package was obtained from
> ftp://ftp.gnu.org/gnu/units
> by John Hasler, the current Debian maintainer.
>
>> I think this database is fairly usable in its current state. Any more
>> development on it
>
> Yes please ! :-)

He he, all right then! There certainly are some things left to
improve. One thing I noticed from the links you sent is that I ignored
a few units used in medicine assuming they were deprecated ages ago -
apparently not...
Then again, encouraging their usage may not be the best thing to do,
but who am I to decide what units people use eh?

>> warrants its own project page somewhere and taking
>> it off-list, I'll no longer pester you with updates on this ;)
>
> Ah, no problem. Please keep posting release announcements. Maybe
> on -announce if so.

Yes, announce would be the right place. I dislike it when people start
using this list for announcements of new versions of their software,
so let's not start doing that myself :)

Alban Hertroys

--
If you can't see the forest for the trees,
cut the trees and you'll see there is no forest.


!DSPAM:737,4a8c44fa10131730049303!



Re: Unit conversion database (was: multiple paramters in aggregate function)

From
Alvaro Herrera
Date:
Alban Hertroys wrote:

> >There's also a Debian package which comes with a text format
> >units database:
> >
> >  http://packages.debian.org/source/sid/units
> >
> >The original source for that:
> >
> >This package was put together by me, James Troup <james@nocrew.org>,
> >from the GNU sources, which I obtained from
> >sunsite.doc.ic.ac.uk:/pub/gnu/units-1.54.tar.gz.
>
> I don't consider that tool very reliable[1]. A number of their
> concepts are probably usable though. I have it's source in my source
> tree (FreeBSD), so ample opportunity to peek.
>
> [1] It doesn't correctly convert °C to °F or vv, that was one of the
> first things I tried.

Seems it's easy to misuse it.  You need tempF(x) and tempC notation for
converting absolute temperature differences:

You have: tempF(212)
You want: tempC
        100


--
Alvaro Herrera                                http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

On Wed, Aug 19, 2009 at 8:24 PM, Alvaro
Herrera<alvherre@commandprompt.com> wrote:
>> [1] It doesn't correctly convert °C to °F or vv, that was one of the
>> first things I tried.
>
> Seems it's easy to misuse it.  You need tempF(x) and tempC notation for
> converting absolute temperature differences:
>
> You have: tempF(212)
> You want: tempC
>        100

That depends on whether you're converting a temperature or a
temperature difference. If you want to know what a 100 degree C drop
in temperature equates to in Fahrenheit the answer is not 212 but
rather 180.

I think it would be useful to have a builtin data type which contained
a float and an opaque text unit. It could support linear operations
like +, -, and sum() by just throwing an error if the units didn't
match.

Then you could add an add-on function which converted one such datum
to another with a desired new units by calling out to the units
program.

That would allow people to store values with heterogenous units. So
for example you could have SMART stats in a single table where the
time values, unitless values, and temperature values are all in the
same column. As long as you only compare, say, drive temperatures to
max temperatures you never actually need to know about the units. It
would serve as an assertion check to ensure you don't compare drive
temperatures to error counts or something like that.

--
greg
http://mit.edu/~gsstark/resume.pdf

Re: Re: Unit conversion database (was: multiple paramters in aggregate function)

From
Alvaro Herrera
Date:
Greg Stark wrote:
> On Wed, Aug 19, 2009 at 8:24 PM, Alvaro
> Herrera<alvherre@commandprompt.com> wrote:
> >> [1] It doesn't correctly convert °C to °F or vv, that was one of the
> >> first things I tried.
> >
> > Seems it's easy to misuse it.  You need tempF(x) and tempC notation for
> > converting absolute temperature differences:
> >
> > You have: tempF(212)
> > You want: tempC
> >        100
>
> That depends on whether you're converting a temperature or a
> temperature difference. If you want to know what a 100 degree C drop
> in temperature equates to in Fahrenheit the answer is not 212 but
> rather 180.

Right -- and there's a different interface for that.

You have: 100 degC
You want: degF
        * 180
        / 0.0055555556

> I think it would be useful to have a builtin data type which contained
> a float and an opaque text unit. It could support linear operations
> like +, -, and sum() by just throwing an error if the units didn't
> match.

This sounds very much like Martijn's tagged types.

--
Alvaro Herrera                                http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

Re: multiple paramters in aggregate function

From
Sim Zacks
Date:
>> That would be true if all units were always convertible to mm, but we
>> have volume also, we also have feet etc.. So that the easiest and
>
> How did you plan on solving that in your multiple-argument aggregate?
> Fake their value by adding 0? That's no different for my suggested
> solution.
Wow. I didn't think this would become such a monster. Awesome work on
your unit conversion system, that will be tons of help.
I apologize for being slow on the response, I am way over-busy right now.

However, getting back to where I was, there are only 2 differences
between what I want to do and what you are suggesting:
1) You need 2 functions, a sum and a conversion, while I wrote the
conversion function in the sum.
2) You need to know before hand which measurement you want in the end
and I don't.

I either need 2 sum functions, one which will just return the final
value and the other will return the unit used, or I need my aggregate to
return a composite type, which is less desirable in my case as I want my
results to be include one value per field (qty, unitid)

In other words, I have a conversion table of all different units. If
there is no conversion between 2 units (such as volume and area) then
the sum returns null.
My unit sum function works now. It takes 2 arguments, a numeric and a
unitid. The state variable is of composite type, with a numeric and an int.
In the aggregate function, it first converts one of the values to the
other (according to the business rules, such that I always go to the
lower measurement, if comparing mm and m, it will convert to mm, in and
cm it will convert to cm).

My query contains select ..,
sum_unitvalues(qty,unitid),sum_units(unitid),...
then the units returned do not have to be known in advance, which is
important in this specific project.

Re: multiple paramters in aggregate function

From
Sim Zacks
Date:
> My query contains select ..,
> sum_unitvalues(qty,unitid),sum_units(unitid),...
> then the units returned do not have to be known in advance, which is
> important in this specific project.
>
To give an example of my required result set:

unitid
1 = mm
2 = inch
3 = ft
4 = gram

create table test(id serial primary key, qty numeric(12,4), unitid int);
insert into test(qty,unitid)
 values(100,2),(200,2),(5,3),(20,1),(800,4)

select sum_unitvalues(qty,unitid) as qty, sum_units(unitid) as unitid
from test where unitid<>4;

qty       |  unitid
----------------------------
 9124   | 1

select sum_unitvalues(qty,unitid) as qty, sum_units(unitid) as unitid
from test  where unitid not in (1,4);

qty       |  unitid
----------------------------
  360    | 2

select sum_unitvalues(qty,unitid) as qty, sum_units(unitid) as unitid
from test;
qty       |  unitid
----------------------------
NULL  | NULL


Re: Unit conversion database (was: multiple paramters in aggregate function)

From
Jasen Betts
Date:
On 2009-08-19, Alban Hertroys <dalroi@solfertje.student.utwente.nl> wrote:
> On 19 Aug 2009, at 19:20, Karsten Hilbert wrote:
>
>> Alban,
>>
>> I think having an installable schema for units of measure with
>> definitions and functions would be a great addition to PostgreSQL.
>
> Karsten,
>
> Thanks for the praise and the links.
>
>> I for one know we would use it in GNUmed (wiki.gnumed.de).
>>
>> A few points:
>>
>> Would these guys be of use as a source for reference data ?
>>
>>   http://unitsofmeasure.org/
>
> That looks certainly interesting, especially the fact that they
> provide a source of units and conversions in an XML format. Although
> their conversion formulas don't look all that easy to parse.
>
> I've run into a few of the problems they mention already; for example
> the slight differences between imperial and US units of measurement
> with the same names and abbreviations...
>
>> You may want to think about whether there's use in combining
>> units with tagged types:
>>
>>   http://svana.org/kleptog/pgsql/taggedtypes.html
>
> Yes, I've been thinking the same thing. I had it bookmarked already
> for the very purpose of checking it out and see how I could use tagged
> types with units.
>
>> There's also a Debian package which comes with a text format
>> units database:
>>
>>   http://packages.debian.org/source/sid/units
>>
>> The original source for that:
>>
>> This package was put together by me, James Troup <james@nocrew.org>,
>> from the GNU sources, which I obtained from
>> sunsite.doc.ic.ac.uk:/pub/gnu/units-1.54.tar.gz.
>
> I don't consider that tool very reliable[1]. A number of their
> concepts are probably usable though. I have it's source in my source
> tree (FreeBSD), so ample opportunity to peek.

the licence is GPL2 though so that may restrict it's use in some
contexts.

> [1] It doesn't correctly convert °C to °F or vv, that was one of the
> first things I tried.

what is "vv"
for  °C to °F RTFM:

units 'tempC(37)' 'tempF'

it handles units (and arbitrary derived units) that are linked by a ratio
It does that very well.

units "mi water/kWh" "mm hg/btu"

Offset units like centigrade and farenheit pose a problem in many
contexts.

if the temperature just dropped 9 °F what's that in °C ?

yet the answer can be coerced from units.

units 'tempF(0)-tempF(9)+tempC(0)' 'tempC'

Re: multiple paramters in aggregate function

From
Karsten Hilbert
Date:
On Thu, Aug 20, 2009 at 10:36:37AM +0300, Sim Zacks wrote:

> In other words, I have a conversion table of all different units. If
> there is no conversion between 2 units (such as volume and area) then
> the sum returns null.

Shouldn't that return NULL IOW unknown ?

Karsten
--
GPG key ID E4071346 @ wwwkeys.pgp.net
E167 67FD A291 2BEA 73BD  4537 78B9 A9F9 E407 1346

Re: multiple paramters in aggregate function

From
Sim Zacks
Date:
<blockquote cite="mid:20090820122224.GA5532@merkur.hilbert.loc"
 type="cite">

    In other words, I have a conversion table of all different units. If
there is no conversion between 2 units (such as volume and area) then
the sum returns null.



Shouldn't that return NULL IOW unknown ?

Karsten


I am not familiar with returning unknown. I know that according to the
spec an aggregate should only return null if all of its values of the
aggregate are null. If there is a way to return unknown in a non-NULL
way, then that would be preferred.

Re: Unit conversion database (was: multiple paramters in aggregate function)

From
Karsten Hilbert
Date:
On Wed, Aug 19, 2009 at 08:31:17PM +0200, Alban Hertroys wrote:

> He he, all right then! There certainly are some things left to
> improve. One thing I noticed from the links you sent is that I
> ignored a few units used in medicine assuming they were deprecated
> ages ago - apparently not...

Ah, tell you what. There's *weird* unit usage in medicine !
There's units which omit parts of themselves (they are
assumed to be known to be implicit). There a units used for
measurments which are only equivalent to each other by some
weird empirical formula.

> Then again, encouraging their usage may not be the best thing to do,
> but who am I to decide what units people use eh?

No chance weaning doctors from mmHg, for example :-))

Karsten
--
GPG key ID E4071346 @ wwwkeys.pgp.net
E167 67FD A291 2BEA 73BD  4537 78B9 A9F9 E407 1346

Re: multiple paramters in aggregate function

From
Karsten Hilbert
Date:
On Thu, Aug 20, 2009 at 03:30:00PM +0300, Sim Zacks wrote:

>         In other words, I have a conversion table of all different units. If
>         there is no conversion between 2 units (such as volume and area) then
>         the sum returns null.
>
>
>     Shouldn't that return NULL IOW unknown ?
>
> I am not familiar with returning unknown. I know that according to the spec an
> aggregate

Oh, OK, I forgot about the aggregate part.

> should only return null if all of its values of the aggregate are
> null. If there is a way to return unknown in a non-NULL way, then that would be
> preferred.

I don't know of any. However, it seems patently wrong to let
an integer sum()-something return 0 when some of its inputs
are NULL. After all, the sum could truly have been 0. This
should either throw an error, return NULL, or let me choose
to ignore NULL input and return the sum of non-NULL input.

But I have a feeling I am tip-toeing into a Holy War situation.

Karsten
--
GPG key ID E4071346 @ wwwkeys.pgp.net
E167 67FD A291 2BEA 73BD  4537 78B9 A9F9 E407 1346

Re: Re: Unit conversion database (was: multiple paramters in aggregate function)

From
Karsten Hilbert
Date:
On Thu, Aug 20, 2009 at 12:06:19PM +0000, Jasen Betts wrote:

> what is "vv"

Vice versa, I'd assume.

Karsten
--
GPG key ID E4071346 @ wwwkeys.pgp.net
E167 67FD A291 2BEA 73BD  4537 78B9 A9F9 E407 1346