Teradata - 从不同的行号计算两个日期之间的差异

Teradata - calculate difference between two dates from different row number

我想将我的 excel 计算移动到 Teradata,但不确定如何操作。 In excel 相当简单,我使用简单的 if 来给我 DIFF =IF(A2=A3, (C2-B3) * 24, "")

NO  T_DATE              L_DATE              DIFF
AAA 10/08/2019 17:02:00 10/08/2019 20:35:00 5.83
AAA 10/08/2019 14:45:00 10/08/2019 15:10:00 11.78
AAA 10/08/2019 03:23:00 10/08/2019 10:25:00 17.32
AAA 09/08/2019 17:06:00 10/08/2019 01:11:00 25.70
AAA 08/08/2019 23:29:00 09/08/2019 10:27:00 
BBB 08/08/2019 09:34:00 08/08/2019 21:19:00 22.23
BBB 07/08/2019 23:05:00 08/08/2019 06:09:00 18.03
BBB 07/08/2019 12:07:00 07/08/2019 20:25:00 22.32
BBB 06/08/2019 22:06:00 07/08/2019 08:53:00 22.77
BBB 06/08/2019 10:07:00 06/08/2019 19:44:00 

有没有在 Teradata 中执行此操作的方法?我想再次获得每个 NO 的 L_DATE 和 T_DATE 之间的小时差。

您可以使用 window 函数来实现此目的。请务必注意,当您减去两个日期或时间戳(在本例中)时,您将以 INTERVAL 类型返回,因此您需要指定所需的 INTERVAL 类型及其大小(SECOND、MINUTE、小时、天等)..

CREATE MULTISET VOLATILE TABLE yourtable(
   ID     VARCHAR(3)
  ,T_DATE TIMESTAMP(0)
  ,L_DATE TIMESTAMP(0)
  ,DIFF   NUMERIC(6,2)
) PRIMARY INDEX (ID) ON COMMIT PRESERVE ROWS;
INSERT INTO yourtable(ID,T_DATE,L_DATE,DIFF) VALUES ('AAA','2019-10-08 17:02:00','2019-10-08 20:35:00',5.83);
INSERT INTO yourtable(ID,T_DATE,L_DATE,DIFF) VALUES ('AAA','2019-10-08 14:45:00','2019-10-08 15:10:00',11.78);
INSERT INTO yourtable(ID,T_DATE,L_DATE,DIFF) VALUES ('AAA','2019-10-08 03:23:00','2019-10-08 10:25:00',17.32);
INSERT INTO yourtable(ID,T_DATE,L_DATE,DIFF) VALUES ('AAA','2019-09-08 17:06:00','2019-10-08 01:11:00',25.70);
INSERT INTO yourtable(ID,T_DATE,L_DATE,DIFF) VALUES ('AAA','2019-08-08 23:29:00','2019-09-08 10:27:00',NULL);
INSERT INTO yourtable(ID,T_DATE,L_DATE,DIFF) VALUES ('BBB','2019-08-08 09:34:00','2019-08-08 21:19:00',22.23);
INSERT INTO yourtable(ID,T_DATE,L_DATE,DIFF) VALUES ('BBB','2019-07-08 23:05:00','2019-08-08 06:09:00',18.03);
INSERT INTO yourtable(ID,T_DATE,L_DATE,DIFF) VALUES ('BBB','2019-07-08 12:07:00','2019-07-08 20:25:00',22.32);
INSERT INTO yourtable(ID,T_DATE,L_DATE,DIFF) VALUES ('BBB','2019-06-08 22:06:00','2019-07-08 08:53:00',22.77);
INSERT INTO yourtable(ID,T_DATE,L_DATE,DIFF) VALUES ('BBB','2019-06-08 10:07:00','2019-06-08 19:44:00',NULL);


SELECT yourtable.*,
    CAST(((LEAD(T_DATE) OVER (PARTITION BY ID ORDER BY T_DATE) - L_DATE) HOUR(4)) AS INTEGER) 
FROM yourtable;


+-----+---------------------+---------------------+--------+-------------------------------------------+
| ID  |       T_DATE        |       L_DATE        |  DIFF  | (LEAD (<value expression>) - L_DATE) HOUR |
+-----+---------------------+---------------------+--------+-------------------------------------------+
| AAA | 2019-08-08 23:29:00 | 2019-09-08 10:27:00 | <null> | 7                                         |
| AAA | 2019-09-08 17:06:00 | 2019-10-08 01:11:00 | 25.70  | 2                                         |
| AAA | 2019-10-08 03:23:00 | 2019-10-08 10:25:00 | 17.32  | 4                                         |
| AAA | 2019-10-08 14:45:00 | 2019-10-08 15:10:00 | 11.78  | 2                                         |
| AAA | 2019-10-08 17:02:00 | 2019-10-08 20:35:00 | 5.83   | <null>                                    |
| BBB | 2019-06-08 10:07:00 | 2019-06-08 19:44:00 | <null> | 3                                         |
| BBB | 2019-06-08 22:06:00 | 2019-07-08 08:53:00 | 22.77  | 4                                         |
| BBB | 2019-07-08 12:07:00 | 2019-07-08 20:25:00 | 22.32  | 3                                         |
| BBB | 2019-07-08 23:05:00 | 2019-08-08 06:09:00 | 18.03  | 3                                         |
| BBB | 2019-08-08 09:34:00 | 2019-08-08 21:19:00 | 22.23  | <null>                                    |
+-----+---------------------+---------------------+--------+-------------------------------------------+

之所以看起来如此丑陋,是因为您正试图比较(减去)两个不同记录中的值。在数据库中,一条记录与另一条记录之间没有关系。没有订购。他们彼此独立生活。这与行(记录)具有顺序(行号)的 excel 完全不同。

我们使用 Window 函数 LEAD() 使用 PARTITION BY 子句将一组记录建立在一个组(一个分区)中,我们给该分区一个排序使用 ORDER BY 子句。然后我们用 LEAD() 表示 "The very next T_DATE in this ordered partition for this record"。

然后我们计算日期并减去两个时间戳。我们指定我们想要一个类型为 HOUR(4)INTERVAL 返回。这最多可以保留 9999 小时,如果超过 9999 小时就会出错。

最后我们将它转​​换为整数,以便您可以对其进行数学运算。但是,如果您不想,则不必进行转换。我添加它是因为我们经常想把时间加在一起等等。


如果您使用的是没有 LEAD() 功能的旧版本 Teradata(这是一个较新的功能),您可以使用 MAX()MIN() 以及一些额外的功能windowing 定义中的语法明确地说 "Just the next record's T_DATE" 像:

 MAX(T_DATE) OVER (PARTITION BY ID ORDER BY T_DATE ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING)