Re: Suggestion for aggregate function

From: Greg Stark <gsstark(at)mit(dot)edu>
To: Bruno Wolff III <bruno(at)wolff(dot)to>
Cc: Greg Stark <gsstark(at)mit(dot)edu>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: Suggestion for aggregate function
Date: 2003-01-17 20:12:58
Message-ID: 873cnr3585.fsf@stark.dyndns.tv
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers


Bruno Wolff III <bruno(at)wolff(dot)to> writes:

> On Fri, Jan 17, 2003 at 13:39:11 -0500,
> Greg Stark <gsstark(at)mit(dot)edu> wrote:
> >
> > So it would be possible to say for example:
> >
> > select min(column1),lookup_min(column1,column2) from tab
> >
> > to do the equivalent of:
> >
> > select column1,column2 where column1=(select min(column1) from tab) limit 1

As several people have pointed out this example isn't sufficiently complex to
make rule out various other reasonably efficient SQL implementations.

If you're unconvinced that this function would be handy consider a more
complex query:

SELECT item.*, store.*, x.lowest_price
FROM item, store, (
SELECT item_id,
min(price) AS lowest_price,
lookup_min(price,store_id) AS lowest_price_store
FROM items_for_sale
WHERE item_category = ?
GROUP BY item_id) AS x
WHERE item.item_id = x.item_id
AND store.store_id = x.store_id

There's really no reason for the database to have to do more than one scan of
items_for_sale with one nested_loops lookup of item and store. Ideally if
there's an index on items_for_sale on item_id, price it should be able to use
it too, but that's unlikely.

Currently to write this I think you would have to join against items_for_sale
twice, once to group by item_id and get the least price, then again to lookup
the store.

SELECT item_id, min(store_id)
FROM items_for_sale, (
SELECT min(price) AS lowest_price
FROM items_for_sale
WHERE item_category = ?
GROUP BY item_id
) AS x
WHERE items_for_sale.item_id = x.item_id
AND items_for_sale.price = x.lowest_price

--
greg

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2003-01-17 20:17:38 Re: Generate user/group sysids from a sequence?
Previous Message Robert Treat 2003-01-17 19:43:00 Re: Generate user/group sysids from a sequence?