Thread: 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?
From
Sferacarta Software
Date:
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'-