我是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。
我错过了什么/做错了什么?
我敢打赌意大利辣香肠比萨饼是x轴值。
ROW_NUMBER() OVER (PARTITION BY meter_id ORDER BY reading_dttm)
这将确保x轴从每米的1再次开始,并且每个读数将始终与x轴上的先前读数相距1。
这让我觉得你应该只使用reading_dttm
作为x_axis
值,而不是用ROW_NUMBER()
制作一个。这样,它们之间有5小时间隙的读数与读数的斜率不同,它们之间有10天的间隙。你可能需要转换reading_dttm
的数据类型,使用像TO_UNIXTIME(reading_dttm)
这样的函数或类似的东西。
我会告诉你我的披萨送货地址。 (开玩笑)。
除了@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,只需剪切并粘贴计算。