查找表中下一次出现的值

时间:2012-10-30 15:07:36

标签: sql tsql

如果已经提及,请提前抱歉。

我正在开发一个数据库,该数据库结构不是特别好,但它由第三方拥有,无法更改。

我需要一些t-sql的帮助来查找表中的下一个值并根据结果返回记录。我先解释一下这些数据。我简化了这一点,以便更容易理解。

Polref      Effective Date       Transaction Type     Suffix        Value
ABCD1       01/06/2010           New Bus              1             175.00
ABCD1       01/06/2011           Ren                  2             200.00
ABCD1       19/08/2011           Adjust               3              50.00
ABCD1       23/04/2012           Adjust               4              50.00
ABCD1       01/06/2012           Ren                  5             275.00

因此,如果我运行2011年的查询,代码将需要在此示例行中返回后缀为2,3和4.所以我一直在尝试查找新总线或Ren的第一个后缀指定的年份,然后为同一个polref的新总线或Ren找到下一个后缀,然后使用这两个后缀值来限制我的记录集。它不起作用!!

我不能使用MAX(),因为2013年的交易已经添加到系统中,我会获得比实际需要更多的记录。

结果我应该期待这个例子的数据是:

ABCD1 300.00

非常感谢任何帮助。

要回答另一个问题,如果我选择2011作为我的年份来运行报告,那么2011年应该只有一个New Bus或Ren交易,所以如果它是一个New Bus交易,下一个主要交易将是一个Ren,如果它的一个人然后下一个主要交易将是一个人。再次在下面的例子中,如果我跑2011年,它应该从2011年6月1日找到Ren,所以我想要返回Ren和两个Adjust记录。

对不起,如果我有点模糊,我没有使用过这个论坛。

我使用的表有很多polrefs所以我需要这个代码来计算所有属于日期范围的polrefs的总数。一些polrefs可能只有一行,一个新总线,一些将有很多行,具体取决于整个政策年度进行了多少次调整

1 个答案:

答案 0 :(得分:2)

部分答案:

此查询:

declare @t table (PolRef char(5) not null, EffectiveDate date not null,TransactionType varchar(10) not null,Suffix int not null,Value decimal(10,2) not null)
insert into @t (Polref,EffectiveDate,TransactionType,Suffix,Value) values
('ABCD1','20100601','New Bus',1,175.00),
('ABCD1','20110601','Ren',2,200.00),
('ABCD1','20110819','Adjust',3,50.00),
('ABCD1','20120423','Adjust',4,50.00),
('ABCD1','20120601','Ren',5,275.00)

;With StartTransactions as (
    select PolRef,Suffix,ROW_NUMBER() OVER (PARTITION BY PolRef ORDER BY Suffix) rn
    from @t where TransactionType in ('New Bus','Ren')
), Periods as (
    select st1.PolRef,st1.Suffix as StartSuffix,st2.Suffix as EndSuffix
    from
        StartTransactions st1
        left join
        StartTransactions st2
            on
                st1.PolRef = st2.PolRef and
                st1.rn = st2.rn - 1
)
select
    p.PolRef,t2.EffectiveDate,SUM(t.Value) as Total
from
    Periods p
        inner join
    @t t
        on
            p.PolRef = t.PolRef and
            p.StartSuffix <= t.Suffix and
            (p.EndSuffix > t.Suffix or
            p.EndSuffix is null)
        inner join
    @t t2
        on
            p.PolRef = t2.PolRef and
            t2.Suffix = p.StartSuffix
group by
    p.PolRef,t2.EffectiveDate

根据每个连续的RenNew Bus交易对每组交易进行分组:

PolRef EffectiveDate Total
------ ------------- ---------------------------------------
ABCD1  2010-06-01    175.00
ABCD1  2011-06-01    300.00
ABCD1  2012-06-01    275.00
从那以后,它应该是微不足道的。只选择您在特定年份感兴趣的那些。但是你的问题在某些细节方面仍然含糊不清,所以我现在还没有进一步说明。