T-SQL эффективно удаляет избыточные данные - PullRequest
0 голосов
/ 02 марта 2011

У меня есть таблица, которая отслеживает ценовые данные с течением времени для различных товаров.Вот упрощенный пример:

Имя таблицы [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

В настоящее время я делаю это курсором, но это невероятно неэффективно, и я чувствую, что должен быть более простой способ получить эти данные.В таблице, с которой я работаю, около 2,3 миллиона записей.

SQL 2000

Спасибо!

1 Ответ

1 голос
/ 02 марта 2011

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, где цена на этот продукт не равна предыдущей записи для этого продукта.

...