1

我是 SQL 新手,我想知道函数(前 1 行和前 1 行之间的行)在 teradata 中的作用,我想简单说明一下,我正在尝试使用这个函数作为测试用例来获取时间间隔开始和结束日期之间的历史表,任何人都可以帮忙或提供任何有用的链接。

SELECT DISTINCT CUST_ID
FROM
(
SELECT 
CUST_ID,
STRT_dt - 
MIN(END_dt) OVER (PARTITION BY CUST_ID ORDER BY END_dt
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS diff
FROM table
QUALIFY diff > 1
) dt
4

2 回答 2

5

这将返回与标准 SQL 相同的结果LAG(END_dt) OVER (PARTITION BY CUST_ID ORDER BY END_dt,即前一行END_dt(或每个 CUST_ID 的第一行为 NULL)。

当您切换到FOLLOWING而不是PRECEDING下一行时,LEAD在标准 SQL 中。

两者LAGLEAD最终都在 TD16.10 中实现。

由于您只是想找到差距并且无法访问实际差异,因此您也可以将其简化为:

SELECT DISTINCT CUST_ID
FROM table
QUALIFY
   STRT_dt - 
   MIN(END_dt)
   OVER (PARTITION BY CUST_ID
         ORDER BY END_dt
         ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) > 1
于 2018-02-14T10:59:23.530 回答
0

假设我们正在处理查询“在 (A) 前面和 (B) 前面之间的行”。在您的情况下,A = 1 和 B = 1。所以这里 (A) 的行为与我们预期的一样,即它指定了与当前行一起包含的行数,以执行我们提到的聚合函数。现在来到 (B),它指定在执行我们指定的聚合函数时要从包含的行中排除的行数(从下面)。


为了更好地理解,考虑 A=3 和 B=1,目前我们正在对第 7 行执行聚合函数。然后作为 A=3,我们需要考虑 4、5、6、7 行来执行聚合函数。现在 B=1 表示在执行上述聚合函数时,应从选定的行中排除最近的 1 行,即 4、5、6、7。在我们的例子中 (4,5,6,7) 应该排除第 7 行。因此,我们将对剩余的行(即 4、5、6 行)执行聚合函数。

希望你明白:)

于 2022-02-03T04:54:03.493 回答