SSRS SQL最接近未来日期与当前日期的日期

SSRS SQL最接近未来日期与当前日期的日期,sql,reporting-services,Sql,Reporting Services,我有一个证券表,增加了空格,以便更好地阅读息票支付日期,如果是债券,我需要制作一个表,其中每个客户和他拥有的证券都有一个列,其中只有下一次息票支付。如果它是一股,它将在表中,但没有付款。 因此,从列优惠券支付日期,我只需要选择下一个优惠券支付日期 从这里我们称之为“优惠券”表: 客户名称I SecID I SecType I CouponPaymentdate 客户1 I US00001 I债券I 2017年6月 客户1 I US00001 I债券I 2018年6月 客户1 I US00001

我有一个证券表,增加了空格,以便更好地阅读息票支付日期,如果是债券,我需要制作一个表,其中每个客户和他拥有的证券都有一个列,其中只有下一次息票支付。如果它是一股,它将在表中,但没有付款。 因此,从列优惠券支付日期,我只需要选择下一个优惠券支付日期

从这里我们称之为“优惠券”表: 客户名称I SecID I SecType I CouponPaymentdate 客户1 I US00001 I债券I 2017年6月 客户1 I US00001 I债券I 2018年6月 客户1 I US00001 I保函I 2019年6月 客户1 I US00001 I债券I 06/2020 客户1 I US00001 I债券I 06/2021

客户1 I US00002 I保函I 2019年3月 客户1 I US00002 I债券I 03/2020 客户1 I US00002 I债券I 03/2021

客户2 I US00003 I共享I-

客户3 I US00004 I保函I 2017年1月 客户3 I US00004 I债券I 2018年1月

期望结果

客户名称I SecID I部门类型I NextCouponPaymentdate 客户1 I US00001 I债券I 06/2020 客户1 I US00002 I债券I 03/2020 客户2 I US00003 I共享I-

对于本专栏,我尝试了这个,但我需要中断ClientName和SecID 从优惠券中选择前1名优惠券。CouponPaymentDate作为CPN 其中CPN.CouponPaymentDate>GETDATE 按CPN.CouponPaymentDate订购


有什么建议吗?我使用SSR,所以可能即使是一个表达式也会有帮助,但我不知道。非常抱歉设置格式编辑:请参阅Alan的解决方案。似乎以更少的代码返回相同的结果

我的方法是创建一个额外的列来计算付款日期之间的差异,并使用row number函数来确定最接近当前日期的记录

我创建了一个临时表来插入您提供的值,并在SecType=Share的couponpaymentdate列中将其替换为null,以测试结果

CREATE TABLE #yourtable (
ClientName nvarchar(50), 
SecID nvarchar(50), 
SecType nvarchar(50), 
CouponPaymentDate datetime)

INSERT INTO #yourtable VALUES
('Client1', 'US00001', 'Bond' , '06/01/2017'),
('Client1', 'US00001', 'Bond' , '06/01/2018'),
('Client1', 'US00001', 'Bond' , '06/01/2019'),
('Client1', 'US00001', 'Bond' , '06/01/2020'),
('Client1', 'US00001', 'Bond' , '06/01/2021'),
('Client1', 'US00002', 'Bond' , '03/01/2019'),
('Client1', 'US00002', 'Bond' , '03/01/2020'),
('Client1', 'US00002', 'Bond' , '03/01/2021'),
('Client2', 'US00003', 'Share', null),      
('Client3', 'US00004', 'Bond' , '01/01/2017'),
('Client3', 'US00004', 'Bond' , '01/01/2018');
列别名“持续时间”中计算的天数差异,仅包括未来天数/空值

select 
ClientName,
SecID,
SecType,
CouponPaymentDate,
MIN(ABS(DATEDIFF(d,GETDATE(),CouponPaymentDate))) as duration_days
into #yourtable2
from #yourtable
WHERE (CouponPaymentDate > GETDATE() OR CouponPaymentDate is null)
group by ClientName,SecID,SecType,CouponPaymentDate
rn表示行数,因为行是按升序持续时间_天排序的,所以rn=1将是最接近当前日期的日期。如果当前日期正好在两个CouponPaymentDate之间,则这还将为您提供未来日期

SELECT ClientName,SecID,SecType,CouponPaymentDate
FROM
(select 
ROW_NUMBER() OVER (partition by SecID order by duration_days, CouponPaymentDate desc) rn,
ClientName,
SecID,
SecType,
CouponPaymentDate,
duration_days
from #yourtable2
) table_alias
where rn = 1

**用优惠券替换表格编辑:参见Alan的解决方案。似乎以更少的代码返回相同的结果

我的方法是创建一个额外的列来计算付款日期之间的差异,并使用row number函数来确定最接近当前日期的记录

我创建了一个临时表来插入您提供的值,并在SecType=Share的couponpaymentdate列中将其替换为null,以测试结果

CREATE TABLE #yourtable (
ClientName nvarchar(50), 
SecID nvarchar(50), 
SecType nvarchar(50), 
CouponPaymentDate datetime)

INSERT INTO #yourtable VALUES
('Client1', 'US00001', 'Bond' , '06/01/2017'),
('Client1', 'US00001', 'Bond' , '06/01/2018'),
('Client1', 'US00001', 'Bond' , '06/01/2019'),
('Client1', 'US00001', 'Bond' , '06/01/2020'),
('Client1', 'US00001', 'Bond' , '06/01/2021'),
('Client1', 'US00002', 'Bond' , '03/01/2019'),
('Client1', 'US00002', 'Bond' , '03/01/2020'),
('Client1', 'US00002', 'Bond' , '03/01/2021'),
('Client2', 'US00003', 'Share', null),      
('Client3', 'US00004', 'Bond' , '01/01/2017'),
('Client3', 'US00004', 'Bond' , '01/01/2018');
列别名“持续时间”中计算的天数差异,仅包括未来天数/空值

select 
ClientName,
SecID,
SecType,
CouponPaymentDate,
MIN(ABS(DATEDIFF(d,GETDATE(),CouponPaymentDate))) as duration_days
into #yourtable2
from #yourtable
WHERE (CouponPaymentDate > GETDATE() OR CouponPaymentDate is null)
group by ClientName,SecID,SecType,CouponPaymentDate
rn表示行数,因为行是按升序持续时间_天排序的,所以rn=1将是最接近当前日期的日期。如果当前日期正好在两个CouponPaymentDate之间,则这还将为您提供未来日期

SELECT ClientName,SecID,SecType,CouponPaymentDate
FROM
(select 
ROW_NUMBER() OVER (partition by SecID order by duration_days, CouponPaymentDate desc) rn,
ClientName,
SecID,
SecType,
CouponPaymentDate,
duration_days
from #yourtable2
) table_alias
where rn = 1

**用优惠券替换您的桌子

以下方法应该有效。只需将@t替换为实际的表名即可

SELECT 
        ClientName, SecID, SecType, NextCouponPaymentDate = CouponPaymentdate 
    FROM (
            SELECT 
                *
                , RowN = ROW_NUMBER() OVER(PARTITION BY ClientName, SecID ORDER BY CouponPaymentdate)
            FROM @t WHERE CouponPaymentdate > getdate() OR SecType = 'Share'
            ) x 
    WHERE RowN =1
忽略我使用的YYYY-MM-DD日期格式,以及我将付款日期设置为每月的第一天,这将为您提供所需的内容


以下几点应该行得通。只需将@t替换为实际的表名即可

SELECT 
        ClientName, SecID, SecType, NextCouponPaymentDate = CouponPaymentdate 
    FROM (
            SELECT 
                *
                , RowN = ROW_NUMBER() OVER(PARTITION BY ClientName, SecID ORDER BY CouponPaymentdate)
            FROM @t WHERE CouponPaymentdate > getdate() OR SecType = 'Share'
            ) x 
    WHERE RowN =1
忽略我使用的YYYY-MM-DD日期格式,以及我将付款日期设置为每月的第一天,这将为您提供所需的内容


您的couponpaymentdate是那种格式吗?年月日?另外,如果当前日期正好在两个couponpaymentdate之间,该怎么办?格式为dd.mm.yyyy,但为了简化起见,我使用了该格式,但它是mm/yyyy。如果当前日期正好在两个couponpaymentdates之间,我需要最接近的未来日期。我不关心过去的耦合付款日期问题期望结果客户1 I US00001 I Bond I 06/2020为什么不考虑客户1 I US00001 I Bond I 06/2021您期望结果背后的逻辑是什么因为2020年6月比2021年6月更接近当前日期您的耦合付款日期是那种格式吗?年月日?另外,如果当前日期正好在两个couponpaymentdate之间,该怎么办?格式为dd.mm.yyyy,但为了简化起见,我使用了该格式,但它是mm/yyyy。如果当前日期正好在两个couponpaymentdates之间,我需要最接近的未来日期。我不关心过去的耦合付款日期问题期望结果客户1 I US00001 I Bond I 06/2020为什么不客户1 I US00001 I Bond I 06/2021您期望结果背后的逻辑是什么因为2020年6月比2021年6月更接近当前日期