Declare @sec_temp table
(
sec_no varchar(10),
amount money,
price_date date
)
insert @sec_temp
values
('123ABC', 25, '2011-01-20'),
('123ABC', 25, '2011-01-19'),
('123ABC', 25, '2011-01-18'),
('123ABC', 20, '2011-01-15'),
('123ABC', 22, '2011-01-13'),
('456DEF', 22, '2011-01-13')
问题:列出具有最新价格(amount
)的不同sec_no以及当前价格的天数。在这种情况下,
结果:
sec_no amount no_of_days_at_price
123ABC 25 3 e.g. 01-18 to 01-20
456DEF 22 1 e.g. 01-13
答案 0 :(得分:2)
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。
已编辑以澄清问题
要从等于当前费率的第一个日期开始计算,请改用此查询
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
AND FINALLY 如果所需的结果实际上是
之间的天数然后唯一要改变的是:
No_of_days_at_price = 1 + DATEDIFF(d, min(price_date), getdate())
答案 1 :(得分:0)
这是一种方法,首先查找最新价格,然后查看不同的最后价格:
select secs.sec_no
, latest.amount as price
, case when previous.price_date is null then 1
else datediff(day, previous.price_date, latest.price_date)
end as days_at_price
from (
select distinct sec_no
from @sec_temp
) secs
cross apply
(
select top 1 amount
, price_date
from @sec_temp
where sec_no = secs.sec_no
order by
price_date desc
) latest
outer apply
(
select top 1 price_date
from @sec_temp
where sec_no = secs.sec_no
and amount <> latest.amount
order by
price_date desc
) previous
打印:
sec_no price days_at_price
123ABC 25,00 5
456DEF 22,00 1