Teradata:日期差异的平均值截断小数
Teradata: Average of date difference truncates decimal
Teradata:我有 Start_Timestamp
和 End_Timestamp
,我需要找到每个 ID
的平均值 Avg_Duration
。
数据集如下所示:
--------------------------------------------------------------------
|ID | Start_Timestamp |End_Timestamp |
--------------------------------------------------------------------
|111 |2021-08-25 19:37:51.327000 |2021-08-26 16:25:51.129600 |
--------------------------------------------------------------------
|111 |2021-07-16 06:17:23.124000 |2021-07-19 13:16:53.185350 |
--------------------------------------------------------------------
|111 |2021-06-22 10:11:21.754400 |2021-02-25 18:48:13.614650 |
--------------------------------------------------------------------
我运行下面的代码:
SELECT ID, AVG((End_Timestamp - Start_Timestamp) DAY ) AS Avg_Duration
FROM Table_A
Group By ID;
结果如下所示:
-----------------------
|ID | Aug_Duration|
-----------------------
|111 | 2|
-----------------------
我预计 Avg_Duration
会是 (1+3+3)/3=2.33
。
我知道 integer division
被截断了。所以,我 CAST
在取平均值将整数转换为小数之前的时间戳差异。我的代码是:
SELECT ID, AVG(CAST((End_Timestamp - Start_Timestamp) DAY AS DECIMAL(2,2))) AS Avg_Duration
FROM Table_A
Group By ID;
我预计 2.33
,但是,现在 TeraData window 是 unresponsive/idle。它既不运行也没有收到任何错误消息。
谁能告诉我哪里出错了,我怎样才能得到 Avg_Duration
小数点后两位而不是截断后的一位?
您的 )
放错了地方。但我怀疑它在 Teradata 上引起了问题,可能你只是没有注意到客户(Studio?)根本没有提交它,因为它是无效的。
这按预期工作 - 在将 DEC(2,2)
(两位有效数字)更改为 DEC(6,2)
(6 位有效数字)以避免溢出错误之后:
AVG(CAST((End_Timestamp - Start_Timestamp DAY(4)) AS DECIMAL(6,2)))
即使使用最大 DAY(4),您可能仍会收到 Interval Overflow 错误,但您的逻辑也可以使用日期计算:
Avg(Cast(End_Timestamp AS DATE) - Cast(Start_Timestamp AS DATE))
最后,由于它基于时间戳,您可能需要更详细的间隔,例如
Avg(End_Timestamp - Start_Timestamp DAY(4) TO SECOND(0))
Avg(End_Timestamp - Start_Timestamp DAY(4) TO MINUTE)
Teradata:我有 Start_Timestamp
和 End_Timestamp
,我需要找到每个 ID
的平均值 Avg_Duration
。
数据集如下所示:
--------------------------------------------------------------------
|ID | Start_Timestamp |End_Timestamp |
--------------------------------------------------------------------
|111 |2021-08-25 19:37:51.327000 |2021-08-26 16:25:51.129600 |
--------------------------------------------------------------------
|111 |2021-07-16 06:17:23.124000 |2021-07-19 13:16:53.185350 |
--------------------------------------------------------------------
|111 |2021-06-22 10:11:21.754400 |2021-02-25 18:48:13.614650 |
--------------------------------------------------------------------
我运行下面的代码:
SELECT ID, AVG((End_Timestamp - Start_Timestamp) DAY ) AS Avg_Duration
FROM Table_A
Group By ID;
结果如下所示:
-----------------------
|ID | Aug_Duration|
-----------------------
|111 | 2|
-----------------------
我预计 Avg_Duration
会是 (1+3+3)/3=2.33
。
我知道 integer division
被截断了。所以,我 CAST
在取平均值将整数转换为小数之前的时间戳差异。我的代码是:
SELECT ID, AVG(CAST((End_Timestamp - Start_Timestamp) DAY AS DECIMAL(2,2))) AS Avg_Duration
FROM Table_A
Group By ID;
我预计 2.33
,但是,现在 TeraData window 是 unresponsive/idle。它既不运行也没有收到任何错误消息。
谁能告诉我哪里出错了,我怎样才能得到 Avg_Duration
小数点后两位而不是截断后的一位?
您的 )
放错了地方。但我怀疑它在 Teradata 上引起了问题,可能你只是没有注意到客户(Studio?)根本没有提交它,因为它是无效的。
这按预期工作 - 在将 DEC(2,2)
(两位有效数字)更改为 DEC(6,2)
(6 位有效数字)以避免溢出错误之后:
AVG(CAST((End_Timestamp - Start_Timestamp DAY(4)) AS DECIMAL(6,2)))
即使使用最大 DAY(4),您可能仍会收到 Interval Overflow 错误,但您的逻辑也可以使用日期计算:
Avg(Cast(End_Timestamp AS DATE) - Cast(Start_Timestamp AS DATE))
最后,由于它基于时间戳,您可能需要更详细的间隔,例如
Avg(End_Timestamp - Start_Timestamp DAY(4) TO SECOND(0))
Avg(End_Timestamp - Start_Timestamp DAY(4) TO MINUTE)