Sql 查找表中下一个值的匹配项

Sql 查找表中下一个值的匹配项,sql,tsql,Sql,Tsql,如果这已经包括在内,请提前道歉 我正在开发一个数据库,它的结构不是特别好,但它属于第三方,无法更改 我需要t-sql的帮助,以查找表中下一个出现的值,并根据结果返回记录。让我先解释一下数据。我简化了它,使它更容易理解 Polref Effective Date Transaction Type Suffix Value ABCD1 01/06/2010 New Bus 1

如果这已经包括在内,请提前道歉

我正在开发一个数据库,它的结构不是特别好,但它属于第三方,无法更改

我需要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年的交易已经添加到系统中,我将获得比实际需要更多的记录

我希望这个示例数据的结果是:

ABCD1300.00

任何帮助都将不胜感激

为了回答另一个问题,如果我选择2011年作为运行报告的年份,那么2011年应该只有一个新总线或Ren事务,因此如果是新总线事务,则下一个主事务将是Ren,如果是Ren,则下一个主事务将是Ren。在我下面的例子中,如果我运行2011年,它应该找到2011年6月1日的Ren,所以我想返回Ren和两个Adjust记录

对不起,我以前没有使用过这个论坛,所以如果我有点含糊不清,很抱歉

我使用的表有许多Polref,因此我需要此代码来计算日期范围内所有Polref的总计。一些POLREF可能只有一行,一辆新公交车,一些POLREF可能有多行,这取决于政策全年进行了多少调整

部分答案:

此查询:

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

因此,仅从特定年份中选择您感兴趣的项目应该很简单。但是你的问题在某些细节上仍然含糊不清,所以我现在不想再进一步了。

我不明白你想要的结果是什么。请提供样品输出。对不起,有点太快了。我需要一行,其中包含Polref和上次和以前续订之间交易的总值,因此在本例中为300.00如果生效日期为,则数据类型是什么?还有一种表达查询的方式——“给定输入年份(和特定客户?)找到最早的
新总线
Ren
行,并返回该行以及下一个
新总线
Ren
行之前的所有后续行,但不包括下一个
新总线
Ren
行”?-如果第一个是
newbus
,我们是同时搜索
newbus
Ren
,还是只搜索
newbus
?(如果您也重新阅读您的问题会有所帮助,因为您谈论的是客户,但不存在这样的专栏)如果您有更多信息要添加,请编辑您的问题,将其包括在内-不要试图在评论中添加大量信息。此表是只包含一个
PolRef
,还是包含多个,如果是这样的话,我们是在计算一个
PolRef
的结果还是所有的结果?后缀是否单调且没有间隙(在
PolRef
中)?我会尽力帮助你,但是你需要仔细考虑所有的数据,告诉我们实际的规则是什么。Damien,非常感谢你的帮助,我使用了你的代码作为基础,它工作得非常好。我为我的帖子的模糊性道歉,你帮了我很多忙,cheers@JulianSlaughter-没问题。希望下次当你问问题时,你能试着更具体地说明需求。我们喜欢专一性。但是,如果你简化了问题,并且明确了问题是如何简化的,这也会有所帮助。样本数据总是好的(就像样本结果一样),但是如果你过度简化,我们可能会假设太多。
PolRef EffectiveDate Total
------ ------------- ---------------------------------------
ABCD1  2010-06-01    175.00
ABCD1  2011-06-01    300.00
ABCD1  2012-06-01    275.00