【问题标题】:Trying to get DateDiff Based on One Field and Update Another Field尝试基于一个字段获取 DateDiff 并更新另一个字段
【发布时间】:2018-02-23 04:00:55
【问题描述】:

我正在尝试使用 DateDiff 函数更新 DaysInPeriod,基于 EFFECTIVESTARTDATE 字段中的更改。

这是我的 DLL:

DROP TABLE Reporting_Table 
CREATE TABLE Reporting_Table (
    Credit_Line_NO       Varchar(10),
    CURRENCY             VARCHAR(3),
    AMOUNT               INT,
    StartDate            DATE,
    EFFECTIVESTARTDATE   DATE,
    EXPIRY_DATE          Date,
    FREQUENCY            INT,
    CO_CODE              VARCHAR(10),
    AsOfDate             Date,
    SOURCEID_REVISED     VARCHAR(255),
    PID                  VARCHAR(5),
    DaysInPeriod         INT
)

INSERT INTO Reporting_Table(CREDIT_LINE_NO,CURRENCY,AMOUNT,STARTDATE,EFFECTIVESTARTDATE,EXPIRY_DATE,FREQUENCY,CO_CODE,ASOFDATE,SourceID_Revised,PID,DaysInPeriod)
VALUES
('1026321','USD','16875','9/30/2017','9/30/2017','9/30/2019','8','US0010001','7/31/2017','','',''),
('1026321','USD','16875','9/30/2017','12/31/2017','9/30/2019','8','US0010001','7/31/2017','','',''),
('1026321','USD','16875','9/30/2017','3/31/2018','9/30/2019','8','US0010001','7/31/2017','','',''),
('1026321','USD','16875','9/30/2017','6/30/2018','9/30/2019','8','US0010001','7/31/2017','','',''),
('1026321','USD','16875','9/30/2017','9/30/2018','9/30/2019','8','US0010001','7/31/2017','','',''),
('1026321','USD','16875','9/30/2017','12/31/2018','9/30/2019','8','US0010001','7/31/2017','','',''),
('1026321','USD','16875','9/30/2017','3/31/2019','9/30/2019','8','US0010001','7/31/2017','','',''),
('1026321','USD','16875','9/30/2017','6/30/2019','9/30/2019','8','US0010001','7/31/2017','','',''),
('1026329','USD','16875','9/30/2017','9/30/2017','9/30/2019','8','US0010001','7/31/2017','','',''),
('1026329','USD','16875','9/30/2017','12/31/2017','9/30/2019','8','US0010001','7/31/2017','','',''),
('1026329','USD','16875','9/30/2017','3/31/2018','9/30/2019','8','US0010001','7/31/2017','','','')

选择 * 来自 Reporting_Table

Select *
From Reporting_Table

我有这个 SQL:

with cte as 
(
select *, rn = row_number() over (partition by Credit_Line_NO,ASOFDATE order by ASOFDATE)
from Reporting_Table
)
Select *
From cte

基本上,当 rn=1 时,DaysInPeriod = 90,然后每下一个 rn,它应该增加 DateDiff(days,rn-1,rn)。它应该根据 Credit_Line_NO 和 ASOFDATE 的变化进行重置,所以我使用的是:

partition by Credit_Line_NO,ASOFDATE

这是我想要实现的示例。

我使用的是 SQL Server 2008,因此无法使用 Lead/Lag 函数。我把下面的 SQL 放在一起,但它没有执行。

SELECT  T1.CREDIT_LINE_NO, 
        T1.CURRENCY,
        T1.AMOUNT,
        T1.STARTDATE,
        T1.EFFECTIVESTARTDATE,
        T1.EXPIRY_DATE,
        T1.FREQUENCY,
        T1.CO_CODE,
        T1.AsOfDate
        MIN(T2.EFFECTIVESTARTDATE) AS Date2, 
        DATEDIFF("D", T1.EFFECTIVESTARTDATE, MIN(T2.EFFECTIVESTARTDATE)) AS DaysDiff 
FROM    Reporting_Table T1
        LEFT JOIN Reporting_Table T2
        ON T1.CREDIT_LINE_NO = T2.CREDIT_LINE_NO
        AND T2.EFFECTIVESTARTDATE > T1.EFFECTIVESTARTDATE 
GROUP BY T1.CREDIT_LINE_NO, 
        T1.CURRENCY,
        T1.AMOUNT,
        T1.STARTDATE,
        T1.EFFECTIVESTARTDATE,
        T1.EXPIRY_DATE,
        T1.FREQUENCY,
        T1.CO_CODE,
        T1.AsOfDate

最后,我想运行一个 UPDATE 查询或 SELECT * INTO NEW_TABLE 查询。

【问题讨论】:

  • 从不执行的查询中得到什么错误信息?
  • 我不清楚
  • 您的查询失败,因为第 9 行“T1.AsOfDate”没有逗号。
  • 按列分区并按列排序是没有意义的。

标签: sql-server sql-server-2008 tsql


【解决方案1】:

您的查询失败,因为第 9 行 T1.AsOfDate 缺少逗号。加入AND T2.EFFECTIVESTARTDATE > T1.EFFECTIVESTARTDATE 会创建一个不必要的一对多联接。我们可以通过在 CTE 中应用 row_number 然后加入 T1.rn = T2.rn +1 来模仿 LAG 函数。

编辑:我将您的 ROW_NUMBER 更新为按EFFECTIVESTARTDATE 排序,因为ASOFDATE 是一个分区列,并且在窗口中始终相同。

Here is the SQL fiddle for this solution.

你可以SELECT INTO这个结果集到一个新的表中或UPDATE一个现有的表中。

WITH cte AS (
    SELECT
        Credit_Line_NO,
        CURRENCY,
        AMOUNT,
        StartDate,
        EFFECTIVESTARTDATE,
        EXPIRY_DATE,
        FREQUENCY,
        CO_CODE,
        AsOfDate,
        SOURCEID_REVISED,
        PID,
        DaysInPeriod,
        ROW_NUMBER() OVER (PARTITION BY Credit_Line_NO, ASOFDATE ORDER BY EFFECTIVESTARTDATE) AS rn
    FROM Reporting_Table
    )

SELECT
    T1.Credit_Line_NO,
    T1.CURRENCY,
    T1.AMOUNT,
    T1.StartDate,
    T1.EFFECTIVESTARTDATE,
    T1.EXPIRY_DATE,
    T1.FREQUENCY,
    T1.CO_CODE,
    T1.AsOfDate,
    T1.SOURCEID_REVISED,
    T1.PID,
    CASE
        WHEN T1.rn = 1 THEN 90
        ELSE DATEDIFF("D", t2.effectivestartdate, t1.effectivestartdate)
        END AS DaysInPreiod,
    T1.rn
FROM cte AS t1
LEFT JOIN cte AS t2 ON
    t1.credit_line_no = t2.credit_line_no
    AND t1.rn = t2.rn + 1

【讨论】:

  • 是的,是的!我认为这几乎会奏效,安德鲁。唯一的事情是,我刚刚意识到,要正确使用 Datediff,我需要按 Credit_Line_NO、AsOfDate、EFFECTIVESTARTDATE 排序。如果我添加它,我会收到一条错误消息,即“ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP 或 FOR XML。”。我试过'Credit_Line_NO,AsOfDate ORDER BY ASOFDATE)AS rn',一切都是rn = 1。啊!!我该如何解决这个问题??!!
猜你喜欢
  • 2022-12-12
  • 2014-12-25
  • 1970-01-01
  • 2014-12-13
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多