7 messages in com.mysql.lists.mysqlRe: Need to find last price and date ...
FromSent OnAttachments
mos27 Sep 2006 21:35 
Douglas Sims27 Sep 2006 21:53 
João Cândido de Souza Neto28 Sep 2006 05:39 
Jonathan Mangin28 Sep 2006 06:27 
Peter Brawley28 Sep 2006 08:12 
Douglas Sims28 Sep 2006 08:48 
mos28 Sep 2006 12:40 
Subject:Re: Need to find last price and date product was sold
From:Douglas Sims (do@apley.com)
Date:09/28/2006 08:48:54 AM
List:com.mysql.lists.mysql

Neat-o.

I think that's much better than the query I proposed with the subselect. However, it doesn't give you price from the last sale of the product, instead it gives you highest price the product was sold for. Also, it can give you multiple rows for each product_code if there are multiple sales at the same price.

Here is a small modification to Peter's query which will give you exactly one row for each product code showing the price at the last sale of that product. (Assuming you have a synthetic key, perhaps an autoincrement field, called "id")

Also, an index on the product_code field will help the speed of this query a lot. (I don't understand why the subselect query is still faster - I don't think it should be.)

SQL is rather fun.

SELECT t1.product_code,t1.date_sold,t1.price_sold FROM trans AS t1 LEFT JOIN trans AS t2 ON t1.product_code = t2.product_code AND (t1.date_sold < t2.date_sold OR (t1.date_sold=t2.date_sold AND t1.id<t2.id) WHERE t2.product_code IS NULL ORDER BY t1.product_code;

Douglas Sims Do@Apley.com

On Sep 28, 2006, at 10:12 AM, Peter Brawley wrote:

Mike,

What I need to do is find the last price_sold for each product_code.

SELECT t1.product_code,t1.date_sold,t1.price_sold FROM trans AS t1 LEFT JOIN trans AS t2 ON t1.product_code = t2.product_code AND t1.price_sold < t2.price_sold WHERE t2.product_code IS NULL ORDER BY t1.product_code;

There's a bit of discussion at http://www.artfulsoftware.com/ queries.php#7/

PB

-----

This should be easy but I can't find a way of doing it in 1 step.

I have a Trans table like:

Product_Code: X(10) Date_Sold: Date Price_Sold: Float

Now there will be 1 row for each Product_Code, Date combination. So over the past year a product_code could have over 300 rows, one row for each day it was sold. There are thousands of products.

What I need to do is find the last price_sold for each product_code. Not all products are sold each day so a product might not have been sold for weeks.

The only solution I've found is to do:

drop table if exists CurrentPrices; create table CurrentPrices select Prod_Code, cast(max(Date_Sold) as Date), -1.0 Price_Sold from Trans group by Prod_Code; alter table CurrentPrices add index ix_ProdCode (Prod_Code); update CurrentPrices CP, Trans T set CP.Price_Sold=T.Price_Sold and T.Date_Sold=CP.Date_Sold;

Is there a way to shorten this? It may take 2-3 minutes to execute. I don't really need a new table as long as I get the Prod_Code and the last Date_Sold.

TIA Mike