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

问题描述 投票:1回答:2

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

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

sql teradata linear-regression
2个回答
1
投票

我敢打赌意大利辣香肠比萨饼是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)这样的函数或类似的东西。

我会告诉你我的披萨送货地址。 (开玩笑)。


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

© www.soinside.com 2019 - 2024. All rights reserved.