select
a.sec_no,
a.amount,
min(price_date) as FirstDateAtPrice,
No_of_days_at_price = COALESCE(DATEDIFF(d, c.price_date, a.price_date),0)
from (
select *, ROW_NUMBER() over (partition by sec_no order by price_date desc) rn
from @sec_temp) a
outer apply (
select top 1 *
from @sec_temp b
where a.sec_no=b.sec_no and a.amount <> b.amount
order by b.price_date desc
) c
where a.rn=1
Подзапрос A определяет наибольшую 1 на группу, то есть самый последний ценовой рекорд для каждого sec_no.Подзапрос C находит первую предыдущую запись, которая содержит другую цену для того же sec_no.Разница в этих двух датах - number of days
искомый.Если вам нужно, чтобы это было единица без предшествующей даты, измените конец строки COALESCE
на 1 вместо 0.
EDITED для уточненного вопроса
Комуначните отсчет с первой даты, равной текущей ставке, вместо этого используйте этот запрос
select
sec_no,
amount,
No_of_days_at_price = 1 + DATEDIFF(d, min(price_date), max(price_date))
from (
select *,
ROW_NUMBER() over (partition by sec_no order by price_date desc) rn,
ROW_NUMBER() over (partition by sec_no, amount order by price_date desc) rn2
from @sec_temp
) X
WHERE rn=rn2
group by sec_no, amount
И, наконец, Если требуемый результат фактически равен дням между
- первая дата, на которую цена равна текущей;и
- сегодня
Тогда единственное, что нужно изменить, это:
No_of_days_at_price = 1 + DATEDIFF(d, min(price_date), getdate())