【问题标题】:Select prev date in column TERADATA在 TERADATA 列中选择上一个日期
【发布时间】:2019-04-16 06:58:46
【问题描述】:

我有一个包含日期列的表格

我还需要选择此列我需要选择不驻留在数据库中的上一个日期 如果存在或当前数据

我尝试了以下查询

select hst1.QUERYID,hst1.starttime, 
ZEROIFNULL(hst2.starttime) as delta
from dbqlogtbl_dba_hst hst1
left outer join dbqlogtbl_dba_hst hst2 on 
hst1.QUERYID = hst2.QUERYID;

我在获取结果时遇到错误

【问题讨论】:

  • 这个错误可能是由zeroifnull 引起的,它只为数字数据定义,而不是时间戳。您应该改用coalesce(hst2.starttime, current_time(0))。而且它不会起作用,因为 QueryID 是唯一的。但是 Gordon 基于 OLAP 函数的回答通常是非常有效的。 lag 最近已实现(16.10+),在您可以使用 max(starttime) over (partition by queryid order by starttime rows between 1 preceding and 1 preceding) 重写之前。顺便说一句,已经有一个QryLogV.LastRespTime...
  • starttime 实际上是 Timestamp(6) 类型,执行此查询时出错。作为单个语句执行。失败 [3800 : HY000] THEN/ELSE 表达式中的数据类型不匹配。
  • 对不起,必须是current_timeSTAMP(0)
  • 使用 SELECT STARTTIME, MAX(STARTTIME) OVER (PARTITION BY 1 ORDER BY STARTTIME DESC ROWS BETWEEN 1 PRECEDING 和 1 PRECEDING) 作为 DBQLOGTBL 的 ENDTIME 来解决这个问题

标签: sql teradata teradata-sql-assistant


【解决方案1】:

你似乎只想要lag()

select hst1.QUERYID, hst1.starttime,
       lag(hst1.starttime) over (order by hst1.starttime)
from dbqlogtbl_dba_hst hst1 left join
     dbqlogtbl_dba_hst hst2
     on hst1.QUERYID = hst2.QUERYID ;

我猜你真的想要这个queryid,所以你需要partition by

       lag(hst1.starttime) over (partition by hst1.QUERYID order by hst1.starttime)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多