Обсуждение: Please help: How to determine largest of two numbers in a query?

Поиск
Список
Период
Сортировка

Please help: How to determine largest of two numbers in a query?

От
Greg Youngblood
Дата:
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: [SQL] Please help: How to determine largest of two numbers in a query?

От
Adam Maddock
Дата:
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
>


Re: [SQL] Please help: How to determine largest of two numbers in a query?

От
David Hartwig
Дата:
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'-