Обсуждение: Please help: How to determine largest of two numbers in a query?
I have a table with the following structure:
yyyymmdd int4
key char(16)
value1 int4
value2 int4
with the following sample data:
yyyymmdd key value1 value2
19981201 hello 32 16
19981201 bye 29 64
19981202 hello 16 20
19981202 bye 23 13
What I need is to select the greatest between value1 and value2, so the
answer would be:
yyyymmdd key value
19981201 hello 32
19981201 bye 64
19981202 hello 20
19981202 bye 23
I can do this via ODBC using access by creating a column which is defined as
IF(value1>value2,value1,value2) but that doesn't work in psql.
How can I make this work in psql?
Thanks
Greg
Greg - This may not be the slickest way to do it, but it works... SELECT yyyymmdd, key, value1 AS value FROM greg WHERE value1 > value2 UNION SELECT yyyymmdd, key, value2 AS value FROM greg WHERE value2 > value1; I hope this helps. :-) Blessings, Adam ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Adam Maddock http://Adam.Maddock.com Detroit, MI adam@maddock.com "BE IMITATORS of God, therefore, as dearly loved children..." (Ephesians 5:1) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ On Wed, 2 Dec 1998, Greg Youngblood wrote: > I have a table with the following structure: > yyyymmdd int4 > key char(16) > value1 int4 > value2 int4 > > with the following sample data: > yyyymmdd key value1 value2 > 19981201 hello 32 16 > 19981201 bye 29 64 > 19981202 hello 16 20 > 19981202 bye 23 13 > > What I need is to select the greatest between value1 and value2, so the > answer would be: > yyyymmdd key value > 19981201 hello 32 > 19981201 bye 64 > 19981202 hello 20 > 19981202 bye 23 > > I can do this via ODBC using access by creating a column which is defined as > IF(value1>value2,value1,value2) but that doesn't work in psql. > > How can I make this work in psql? > > Thanks > Greg >
My $.03 worth, without really knowing what these values represent:
There is no such "standard" query that can conditionally select between two
columns. Fortunately PostgreSQL will allow you to create function - of one
does not already exist.
The function would be something like:
greater_int(integer a, integer b)
It takes two integers arguments and returns the greater integer.
Then you do something like:
CREATE VIEW myview AS
SELECT yyymmdd, key, greater_int(value1, value2) FROM mytable;
Or just do the SELECTs directly.
This may not be the most efficient way to accomplish your goal. I would also
take a good look at may table design. Value1 and value2 MAY be a repeating
group and you may want to normalize a little more. Or not.
Greg Youngblood wrote:
> I have a table with the following structure:
> yyyymmdd int4
> key char(16)
> value1 int4
> value2 int4
>
> with the following sample data:
> yyyymmdd key value1 value2
> 19981201 hello 32 16
> 19981201 bye 29 64
> 19981202 hello 16 20
> 19981202 bye 23 13
>
> What I need is to select the greatest between value1 and value2, so the
> answer would be:
> yyyymmdd key value
> 19981201 hello 32
> 19981201 bye 64
> 19981202 hello 20
> 19981202 bye 23
>
> I can do this via ODBC using access by creating a column which is defined as
> IF(value1>value2,value1,value2) but that doesn't work in psql.
>
> How can I make this work in psql?
>
> Thanks
> Greg
Re[2]: [SQL] Please help: How to determine largest of two numbers in a query?
От
Sferacarta Software
Дата:
Hello David,
giovedì, 3 dicembre 98, you wrote:
DH> My $.03 worth, without really knowing what these values represent:
DH> There is no such "standard" query that can conditionally select between two
DH> columns. Fortunately PostgreSQL will allow you to create function - of one
DH> does not already exist.
DH> The function would be something like:
DH> greater_int(integer a, integer b)
DH> It takes two integers arguments and returns the greater integer.
DH> Then you do something like:
DH> CREATE VIEW myview AS
DH> SELECT yyymmdd, key, greater_int(value1, value2) FROM mytable;
DH> Or just do the SELECTs directly.
DH> This may not be the most efficient way to accomplish your goal. I would also
DH> take a good look at may table design. Value1 and value2 MAY be a repeating
DH> group and you may want to normalize a little more. Or not.
DH> Greg Youngblood wrote:
>> I have a table with the following structure:
>> yyyymmdd int4
>> key char(16)
>> value1 int4
>> value2 int4
>>
>> with the following sample data:
>> yyyymmdd key value1 value2
>> 19981201 hello 32 16
>> 19981201 bye 29 64
>> 19981202 hello 16 20
>> 19981202 bye 23 13
>>
>> What I need is to select the greatest between value1 and value2, so the
>> answer would be:
>> yyyymmdd key value
>> 19981201 hello 32
>> 19981201 bye 64
>> 19981202 hello 20
>> 19981202 bye 23
>>
>> I can do this via ODBC using access by creating a column which is defined as
>> IF(value1>value2,value1,value2) but that doesn't work in psql.
>>
>> How can I make this work in psql?
>>
>> Thanks
>> Greg
PostgreSQL has already these built-in funcions (those used on
aggregate MIN/MAX):
int2 |int2larger |int2 int2 |larger of two
int2 |int2smaller |int2 int2 |smaller of two
int4 |int4larger |int4 int4 |larger of two
int4 |int4smaller |int4 int4 |smaller of two
int8 |int8larger |int8 int8 |larger of two
int8 |int8smaller |int8 int8 |smaller of two
exemple:
SELECT int4larger(3,10)
int4larger
----------
10
(1 row)
-Jose'-