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

REGR_SLOPE in Teradata SQL Query Returning 0 Slope

我是 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_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 天的读数具有不同的斜率。您可能需要使用 TO_UNIXTIME(reading_dttm) 或类似的函数转换 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,只需剪切并粘贴计算即可。