首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当前和以前的日期

当前和以前的日期
EN

Stack Overflow用户
提问于 2018-06-08 14:53:09
回答 1查看 73关注 0票数 1

我正在为下面的场景寻找Teradata查询帮助。

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

对于第一个事务的开始日期,我想将其硬编码为2000-01-01。

代码语言:javascript
复制
Custid   Date       Amount    

1        2014-10-11    $100
1        2014-11-01    $50
1        2015-01-05    $20
2        2016-01-01    $40
2        2016-05-01    $60

我要输出如下所示

代码语言:javascript
复制
CustID   Start_Date   End_Date     Amount
1        2000-01-01   2014-10-11   $100
1        2014-10-11   2014-11-01   $50
1        2014-11-01   2015-01-05   $20
2        2000-01-1    2016-01-01   $40
2        2016-01-01   2016-05-01   $60

有谁能帮上忙吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-08 15:03:18

您可以使用窗口函数来实现这一点(本质上这与其他RDBMS中的Lag()功能类似):

代码语言:javascript
复制
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;

正在使用的例子:

代码语言:javascript
复制
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','$100');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (1,'2014-11-01','$50');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (1,'2015-01-05','$20');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (2,'2016-01-01','$40');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (2,'2016-05-01','$60');

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 | $100   |
|      1 | 10/11/2014 | 11/1/2014  | $50    |
|      1 | 11/1/2014  | 1/5/2015   | $20    |
|      2 | 1/1/2000   | 1/1/2016   | $40    |
|      2 | 1/1/2016   | 5/1/2016   | $60    |
+--------+------------+------------+--------+

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

代码语言:javascript
复制
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;

正在使用的例子:

代码语言:javascript
复制
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','$100');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (1,'2014-11-01','$50');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (1,'2015-01-05','$20');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (2,'2016-01-01','$40');
INSERT INTO mytable(Custid,"Date",Amount) VALUES (2,'2016-05-01','$60');


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 | $60    |
|      1 | 2014-11-01 | 2015-01-05 | $20    |
|      2 | 2000-01-01 | 2016-01-01 | $40    |
|      1 | 2014-10-11 | 2014-11-01 | $50    |
|      1 | 2000-01-01 | 2014-10-11 | $100   |
+--------+------------+------------+--------+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50763295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档