我是Teradata SQL的相对新手,遇到了这个奇怪的(我觉得奇怪的)情况。我试图对传感器数据运行回归(REGR_SLOPE)。我正在收集一天的传感器读数,每天是80次观察,这由外部SELECT中的COUNT确认。我的疑问是:
SELECT
d.meter_id,
REGR_SLOPE(d.reading_measure, d.x_axis) AS slope,
COUNT(d.x_axis) AS xcount,
COUNT(d.reading_measure) AS read_count
FROM
(
SELECT
meter_id,
reading_measure,
row_number() OVER (ORDER BY Reading_Dttm) AS x_axis
FROM data_mart.v_meter_reading
WHERE Reading_Start_Dt = '2017-12-12'
AND Meter_Id IN (11932101, 11419827, 11385229, 11643466)
AND Channel_Num = 5
) d
GROUP BY 1
当我使用子查询中的“IN”子句指定Meter_Id时,我得到斜率值,但是当我取出它时(遍历所有米),所有斜率都是0(零)。我想简单地通过一天的观察(80)。
我正在使用Teradata v15.0。
我错过了什么/做错了什么?
答案 0 :(得分:1)
我敢打赌Pepperoni Pizza这是x_axis值。
ROW_NUMBER() OVER (PARTITION BY meter_id ORDER BY reading_dttm)
这将确保每个仪表的x_axis从1开始重新开始,并且每次读数将始终与x_axis上的读数相差1。
这使得我应该使用reading_dttm
作为x_axis
值,而不是使用ROW_NUMBER()
制作一个值。这样,它们之间有5小时间隙的读数与读数的斜率不同,它们之间有10天的间隙。您可能需要转换reading_dttm
的数据类型,使用类似TO_UNIXTIME(reading_dttm)
的函数或类似的函数。
我会告诉你我的披萨送货地址。 (开玩笑。)
答案 1 :(得分:1)
@ MatBailie回答的补充。
你可能知道你应该按时间戳而不是ROW_NUMBER
订购,但你不能这样做,因为Teradata不允许在这个地方加时间戳(奇怪)。
Teradata中没有内置的TO_UNIXTIME功能,但你可以改用它:
REPLACE FUNCTION TimeStamp_to_UnixTime (ts TIMESTAMP(6))
RETURNS decimal(18,6)
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC
SQL SECURITY DEFINER
COLLATION INVOKER
INLINE TYPE 1
RETURN
(Cast(ts AS DATE) - DATE '1970-01-01') * 86400
+ (Extract(HOUR From ts) * 3600)
+ (Extract(MINUTE From ts) * 60)
+ (Extract(SECOND From ts));
如果您不允许创建UDF,只需剪切并粘贴计算。