T-SQL有效地剥离冗余数据

时间:2011-03-02 14:50:39

标签: tsql sql-server-2000

我有一张表来跟踪各种商品的价格数据。这是一个简化的例子:

表名[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 个答案:

答案 0 :(得分: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的每一行,其中该产品的价格不等于该产品的先前记录。