2011-03-02 58 views
0

我有一张表格,可以跟踪各种商品的价格数据。这里有一个简单的例子:T-SQL高效剥离冗余数据

表名[Product_Prices]

PRODUCT DATE PRICE 
------------------ 
Corn 1/1/2011 1.35 
Corn 1/2/2011 1.40  
Corn 1/3/2011 1.40  
Corn 1/4/2011 1.50  
Beef 1/1/2011 1.35  
Beef 1/2/2011 1.15  
Beef 1/3/2011 1.15  
Beef 1/4/2011 1.30  
Beef 1/5/2011 1.30  
Beef 1/6/2011 1.35 

我想拉动的最早日期的价格变化,为每个实例那里的价格实际上没有更改查询。基于上面的示例表,这是我想要的输出:

PRODUCT DATE PRICE 
------------------  
Corn 1/1/2011 1.35  
Corn 1/2/2011 1.40  
Corn 1/4/2011 1.50  
Beef 1/1/2011 1.35  
Beef 1/2/2011 1.15  
Beef 1/4/2011 1.30  
Beef 1/6/2011 1.35 

我目前做的光标,但它是令人难以置信的效率低下,我觉得必须有一个更简单的方式来获得这些数据。我正在使用的表格有大约230万条记录。

SQL 2000

谢谢!

回答

1

不幸的是,SQL不是一种非常适合使用有序集的语言(关系数据库非常适合,但SQL语言不适用)。此外,使用这些设置更容易的一些T-SQL功能(例如,ROW_NUMBER())直到SQL Server 2005才被引入。

由于SQL Server 2000的限制,您必须执行类似这样的:

select 
    pp.Product, 
    pp.Date, 
    pp.Price 

from Product_Prices pp 

where pp.Price <> (select top 1 
         pp2.Price 

        from Product_Prices pp2 

        where pp2.Date < pp.Date 
        and pp2.Product = pp.Product 

        order by pp2.Date desc) 

(我没有SQL Server 2000中可用于测试,但我相信这应该在2000年正常运行)

这将从Product_Prices检索的所有行上的价格该产品是不等于该产品以前的记录。

+0

我必须添加一个IsNull嵌套查询,否则它跳过每个产品的第一个价格。但是这使我走上了正确的道路。谢谢! – Rob 2011-03-02 18:18:27