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