2011-09-23 63 views
0

我有一个带有列周期的表。在这个列中的值将是这样的,201101,201102,201103等,201112,201201等如果我给出一个数n和任何周期p,那么它必须检索一个period = p-n。这意味着它必须经过n个时期。请帮助我如何做到这一点。我使用SQL Server 2008.周期列是整数类型。在SQL Server中获得超出给定行的n行

+0

所以假设如果'p' ='201101'和'n' = 2你想在'201010'和'201101'之间?每个时期是否只有一行? –

+0

也许OP只想要201010,因为他说_it必须检索* a * period_ – Marco

+0

对于您的信息,此表中的时间段将具有yyyymm的值。所以如果给定的p是200901并且n是10,那么它必须在200901之前走10个周期,也就是必须走200803。希望你明白了。 –

回答

1

如果我知道你需要什么,试试这个:

SELECT TOP 1 * FROM 
(
    SELECT TOP n * FROM your_table 
    WHERE period < p 
    ORDER BY period DESC) as tb 
ORDER BY tb.period 

我的想法是先取N个周期落后(与子查询),然后采取(与主查询)从子查询中的最后一个记录。
如果你想有一个周期(不只是一个记录),你可以使用:

SELECT TOP n * FROM your_table 
WHERE period < p 
ORDER BY period DESC 
+0

它工作马可..令人惊叹。万分感谢。 –

+0

Marco,您的第一个将获得一个位于p-n位置的记录。在第三个查询中,您使用了p-n和p之间的关系。如果p = 201101和n = 10,那么p-n = 201091。不会有像这样的任何时期na。 –

+0

@Robin:我删除了那部分。有一个误解,因为你告诉我们_retrieve一个时期= p - n_。无论如何,其他查询工作,所以它没关系:) – Marco

0

如果我理解正确的,它看起来像你需要一个说法之间。

SELECT period from table where period between n and p 

在这种情况下,N和P是整数。

有关SQL的更多信息,请http://w3schools.com/sql/default.asp

0

你可以试试这个...

select * from your_table 
where period = convert(varchar(6),dateadd(m,addnumber,convert(datetime,convert(varchar(6),startperiod)+'01')),112) 

addnumer =每月增加(positiv)或删除(是负面的)

startperiod =开始期间

我认为这是一个更好的解决方案,因为如果一段时间不在您的表中,那么您不会得到错误的结果!