当前和以前日期的 Teradata Comaprison

Teradata Comaprison for Current and Previous Dates

我正在寻找 Teradata SQL查询以下场景的帮助。

我有一个 table,其中包含客户 ID 以及交易日期和金额字段,并希望获得包含开始日期和结束日期以及每个客户在这些日期之间花费的金额的所需输出。

对于第一笔交易的开始日期,我想硬编码为 2000-01-01

Custid   Date       Amount    

1        2014-10-11    0
1        2014-11-01    
1        2015-01-05    
2        2016-01-01    
2        2016-05-01    

我想要输出类似下面的内容

CustID   Start_Date   End_Date     Amount
1        2000-01-01   2014-10-11   0
1        2014-10-11   2014-11-01   
1        2014-11-01   2015-01-05   
2        2000-01-1    2016-01-01   
2        2016-01-01   2016-05-01   

有人可以帮助解决 Teradata 中的查询问题

您可以使用 Window 函数来完成此操作(本质上这类似于其他 RDBMS 中的 Lag() 功能):

SELECT
    CustId,
    COALESCE(MAX("Date") OVER (PARTITION BY CustId ORDER BY "Date" ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), DATE '2000-01-01') AS Start_Date,
    "Date" as End_Date,
    Amount
FROM
    yourtable;

使用示例:

CREATE MULTISET VOLATILE TABLE mytable(
   Custid INTEGER  NOT NULL
  ,"Date"   DATE  NOT NULL
  ,Amount VARCHAR(5) NOT NULL
) PRIMARY INDEX (CustID) ON COMMIT PRESERVE ROWS;

INSERT INTO mytable(Custid,"Date",Amount) VALUES (1,'2014-10-11','0');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (1,'2014-11-01','');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (1,'2015-01-05','');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (2,'2016-01-01','');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (2,'2016-05-01','');

SELECT
    CustId,
    COALESCE(MAX("Date") OVER (PARTITION BY CustId ORDER BY "Date" ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), DATE '2000-01-01') AS Start_Date,
    "Date" as End_Date,
    Amount
FROM
    mytable;

DROP TABLE mytable;

+--------+------------+------------+--------+
| Custid | Start_Date |  End_Date  | Amount |
+--------+------------+------------+--------+
|      1 | 1/1/2000   | 10/11/2014 | 0   |
|      1 | 10/11/2014 | 11/1/2014  |     |
|      1 | 11/1/2014  | 1/5/2015   |     |
|      2 | 1/1/2000   | 1/1/2016   |     |
|      2 | 1/1/2016   | 5/1/2016   |     |
+--------+------------+------------+--------+

您可以选择在 SELECT 子句中使用相关子查询:

SELECT 
    CustId,
    COALESCE((SELECT MAX("Date") FROM myTable WHERE mt.CustId = CustID AND "Date" < mt."Date"), DATE '2000-01-01') AS Start_Date,
    "Date" AS End_Date,
    amount AS amount
FROM
    mytable mt;

使用示例:

CREATE MULTISET VOLATILE TABLE mytable(
   Custid INTEGER  NOT NULL
  ,"Date"   DATE  NOT NULL
  ,Amount VARCHAR(5) NOT NULL
) PRIMARY INDEX (CustID) ON COMMIT PRESERVE ROWS;

INSERT INTO mytable(Custid,"Date",Amount) VALUES (1,'2014-10-11','0');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (1,'2014-11-01','');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (1,'2015-01-05','');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (2,'2016-01-01','');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (2,'2016-05-01','');


SELECT 
    CustId,
    COALESCE((SELECT MAX("Date") FROM myTable WHERE mt.CustId = CustID AND "Date" < mt."Date"), DATE '2000-01-01') AS Start_Date,
    "Date" AS End_Date,
    amount AS amount
FROM
    mytable mt;


DROP TABLE mytable;

+--------+------------+------------+--------+
| Custid | Start_Date |  End_Date  | amount |
+--------+------------+------------+--------+
|      2 | 2016-01-01 | 2016-05-01 |     |
|      1 | 2014-11-01 | 2015-01-05 |     |
|      2 | 2000-01-01 | 2016-01-01 |     |
|      1 | 2014-10-11 | 2014-11-01 |     |
|      1 | 2000-01-01 | 2014-10-11 | 0   |
+--------+------------+------------+--------+