当前和以前日期的 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 |
+--------+------------+------------+--------+
我正在寻找 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 |
+--------+------------+------------+--------+