从时间戳创建7个字段(每天一个)

时间:2014-05-07 14:54:20

标签: sql teradata

我有一个带有时间戳字段的数据表。

对于我正在进行的分析,我需要创建一个7个字段宽的表和24个记录:一周7天和一天24小时。

目标是按周计算特定事件。

凭借我目前在SQL方面的知识水平,我将尝试以下方式:

SELECT EXTRACT(DAY FROM THE_TIMESTAMP_FIELD) = 1, EXTRACT(DAY FROM THE_TIMESTAMP_FIELD) = 2, etc

可是:

  1. 我使用Teradata并且datepart()或datename()似乎不起作用(对于日期名称,例如Mon,Tue,wed等)
  2. 上面的SELECT语句示例将生成该月中的某一天(第1,第2,第3等)。
  3. 是否有更好的方式{@ 1}}每周的每一天,而不是每天1:7手动输入SELECT语句?

    我怎么能在teradata中提取日期名称?

1 个答案:

答案 0 :(得分:2)

你想要一种PIVOT查询,遗憾的是TD不支持。

但它有可能,看起来像很多源代码,但它主要是剪切&粘贴&修改

假设某个表tab的时间戳列为ts,您希望对列col求平均值:

SELECT
   EXTRACT(HOUR FROM ts) as "hour"
  ,AVG(CASE WHEN ts (FORMAT 'eee') (CHAR(3)) = 'mon' THEN col END) AS mon
  ,AVG(CASE WHEN ts (FORMAT 'eee') (CHAR(3)) = 'tue' THEN col END) AS tue
  ,AVG(CASE WHEN ts (FORMAT 'eee') (CHAR(3)) = 'wed' THEN col END) AS wed
  ,AVG(CASE WHEN ts (FORMAT 'eee') (CHAR(3)) = 'thu' THEN col END) AS thu
  ,AVG(CASE WHEN ts (FORMAT 'eee') (CHAR(3)) = 'fri' THEN col END) AS fri
  ,AVG(CASE WHEN ts (FORMAT 'eee') (CHAR(3)) = 'sat' THEN col END) AS sat
  ,AVG(CASE WHEN ts (FORMAT 'eee') (CHAR(3)) = 'sun' THEN col END) AS sun
FROM tab
GROUP BY 1
ORDER BY 1

顺便说一下,EXTRACT(DAY...)不会返回星期几,也就是1月31日