T-SQL查询获取项目当前价格的天数

时间:2011-01-24 01:06:30

标签: sql tsql sql-server-2008

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

2 个答案:

答案 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