用于获取列的每个不同值的前10行的SQL查询

时间:2014-04-11 03:34:26

标签: sql sql-server

我有一个表定义如下:

第一列表示日期,第二列表示期货合约'称为术语描述'(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行。请帮忙。

1 个答案:

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

这里发生的是:我们首先将表分成子集,其中子集的keyDate列。然后,我们在每个子集中按DateTDF对行进行排序。 row_number()函数根据上述操作为每一行分配序列号。最后,我们只使用行号来过滤并获得所需的行。如果我们想要前n行,我们可以使用过滤器where rn < (n+1)