Выбор строк, где значение изменилось - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть таблица, которая показывает цену продуктов на ежедневной основе. Товар имеет 3 цены: оптом, объем и оформление.

Таблица обновляется ежедневно с текущими ценами, большинство дней без изменений. Однако я хочу выбрать строки, в которых одно из значений изменилось, и я борюсь за идеи. Я попробовал группу, но, поскольку цены растут и падают, это не сработает.

select date_entered, 
       WholeSale,
       Volume,
       Clearance 
FROM pricetable 
where product = 'TANGO'
order by date_entered desc

Приведенное выше выбирает все строки в таблице для заданного продукта.

Как я могу сделать так, чтобы только строки, в которых произошли изменения, оптовая или объем или оформление.

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018
select p1.date_entered, 
       p1.WholeSale,
       p1.Volume,
       p1.Clearance 
FROM pricetable p1
CROSS APPLY
--cross apply to most recent prior record
(SELECT TOP 1 * 
        FROM pricetable p2 
            where p1.product = p2.product 
                and p2.date_entered < p1.date_entered 
                    order by p2.date_entered desc) CA
where p1.product = 'TANGO'
  and (p1.wholesale != CA.wholesale or p1.volume != CA.volume or p1.clearence != CA.clearence)
order by p1.date_entered desc
0 голосов
/ 19 ноября 2018

Сравните значения каждой строки со значениями предыдущего дня:

SELECT * FROM pricetable p WHERE (p.product = 'TANGO') AND
(
    (p.WholeSale <> (SELECT WholeSale FROM pricetable WHERE product = 'TANGO' AND date_entered = dateadd(day, -1, p.date_entered))
OR
    (p.Volume <> (SELECT Volume FROM pricetable WHERE product = 'TANGO' AND date_entered = dateadd(day, -1, p.date_entered))
OR
    (p.Clearance <> (SELECT Clearance FROM pricetable WHERE product = 'TANGO' AND date_entered = dateadd(day, -1, p.date_entered))
)
0 голосов
/ 19 ноября 2018

ВОПРОС БЫЛ ОРИГИНАЛЬНО СОВЕРШЕННЫМ SQL-СЕРВЕРОМ (без версии). Это работает для SQL Server 2012 +:

Используйте lag(). Примерно так:

select pt.*
from (select pt.*,
             lag(wholesale) over (partition by product 
                                  order by date_entered) as prev_wholesale,
             lag(volume)    over (partition by product 
                                  order by date_entered) as prev_volume,
             lag(clearance) over (partition by clearance 
                                  order by date_entered) as prev_clearance
      from pricetable
      where product = 'TANGO'
     ) pt
where (prev_wholesale is null or prev_wholesale <> wholesale) or
      (prev_volume is null or prev_volume <> volume) or
      (prev_clearance is null or prev_clearance <> clearance)          
order by date_entered desc;
...