我有一个表定义如下:
第一列表示日期,第二列表示期货合约'称为术语描述'(TDF),第三个是TDF的价格。
Date TDF Price
2012-01-30 Jan-12 32.75
2012-01-30 Feb-12 45.21
2012-01-30 Mar-12 37.34
2012-01-31 Jan-12 33.57
2012-01-31 Feb-12 34.80
2012-01-31 Feb-12 38.56
2012-02-01 Jan-12 47.97
2012-02-01 Feb-12 43.13
2012-02-01 Mar-12 38.41
2012-02-01 Apr-12 38.56
我从查询中得到了上述结果集。从这里我需要获得每个日期的前两行。 1月30日为2,1月31日为2,2月1日为2。我该怎么做?
select TermDescription,ContractDate,Price,SortOrder into #tbtp from BaseTermPrice
inner hash join Term
on
Term.TermID = BaseTermPrice.TermID
where BaseID = 19 and PeakType = 'On-Pk'
and ContractDate > '2011-01-01'
order by ContractDate,SortOrder
上面的查询产生了我上面发布的表格。然后我认为以下查询会产生我想要的结果:
select top 2 ContractDate,TermDescription,Price from #tbtp a WHERE
a.ContractDate in (Select distinct(ContractDate) from #tbtp)
但事实并非如此。它只是产生了上面发布的表格的前2行。我想要的每个日期不是2行。请帮忙。
答案 0 :(得分:1)
假设您有一个名为#tbtp
的临时表,其中包含显示的数据,您可以尝试这样做以获得所需的结果:
;with cte as
(select
[Date],
TDF,
Price,
row_number() over (partition by [Date] order by [Date], TDF) rn
from #tbtp)
select [Date], TDF, Price
from cte
where rn in (1,2)
这里发生的是:我们首先将表分成子集,其中子集的key
是Date
列。然后,我们在每个子集中按Date
和TDF
对行进行排序。 row_number()
函数根据上述操作为每一行分配序列号。最后,我们只使用行号来过滤并获得所需的行。如果我们想要前n行,我们可以使用过滤器where rn < (n+1)
。