Teradata SQL查询中的REGR_SLOPE返回0斜率

时间:2017-12-22 23:31:34

标签: sql teradata linear-regression

我是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。

我错过了什么/做错了什么?

2 个答案:

答案 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,只需剪切并粘贴计算。