追加上一个事务日期SQL

追加上一个事务日期SQL,sql,teradata,Sql,Teradata,我有一个表,显示客户id、产品id、浏览日期、购买日期以及浏览日期和购买日期之间的差异。看起来像这样 id pID b_Date p_Date 1 001 7/20/2014 7/20/2014 1 001 7/20/2014 7/20/2014 1 002 7/20/2014 7/20/2014 2 001 7/20/2014 7/20/2014 2 001 7/20/2014 8/01/2014 2 002 7/25/2014

我有一个表,显示客户id、产品id、浏览日期、购买日期以及浏览日期和购买日期之间的差异。看起来像这样

id  pID  b_Date     p_Date   
1   001  7/20/2014  7/20/2014
1   001  7/20/2014  7/20/2014
1   002  7/20/2014  7/20/2014
2   001  7/20/2014  7/20/2014
2   001  7/20/2014  8/01/2014
2   002  7/25/2014  8/01/2014
2   002  7/26/2014  8/01/2014
2   002  7/28/2014  8/01/2014
2   002  7/28/2014  8/01/2014
id  pID  b_Date     p_Date     latest_purchase_date
1   001  7/20/2014  7/20/2014  'N/A'
1   001  7/20/2014  7/20/2014  'N/A'
1   002  7/20/2014  7/20/2014  'N/A'
2   001  7/20/2014  7/20/2014  'N/A'
2   001  7/20/2014  8/01/2014  7/20/2014
2   002  7/25/2014  8/01/2014  7/20/2014
2   002  7/26/2014  8/01/2014  7/20/2014
2   002  7/28/2014  8/01/2014  7/20/2014
2   002  7/28/2014  8/01/2014  7/20/2014
在最近一次购买之前,为每位客户追加最新购买日期的最有效方式是什么。所以,结果会是这样的

id  pID  b_Date     p_Date   
1   001  7/20/2014  7/20/2014
1   001  7/20/2014  7/20/2014
1   002  7/20/2014  7/20/2014
2   001  7/20/2014  7/20/2014
2   001  7/20/2014  8/01/2014
2   002  7/25/2014  8/01/2014
2   002  7/26/2014  8/01/2014
2   002  7/28/2014  8/01/2014
2   002  7/28/2014  8/01/2014
id  pID  b_Date     p_Date     latest_purchase_date
1   001  7/20/2014  7/20/2014  'N/A'
1   001  7/20/2014  7/20/2014  'N/A'
1   002  7/20/2014  7/20/2014  'N/A'
2   001  7/20/2014  7/20/2014  'N/A'
2   001  7/20/2014  8/01/2014  7/20/2014
2   002  7/25/2014  8/01/2014  7/20/2014
2   002  7/26/2014  8/01/2014  7/20/2014
2   002  7/28/2014  8/01/2014  7/20/2014
2   002  7/28/2014  8/01/2014  7/20/2014

我使用的是Teradata 13.1

Teradata没有延迟,但很容易重写

由于有多行具有相同的p_日期,因此您需要随时跟踪它的变化

SELECT id, pid, b_date, p_date
   ,MAX(last_dt) -- fill the NULLs with the last date
    OVER (PARTITION BY id ORDER BY p_date, last_dt DESC
          ROWS UNBOUNDED PRECEDING)
FROM
 (
   SELECT id, pid, b_date, p_date,
      NULLIF(MIN(p_date) -- return the date only when there's a change, otherwise NULL
             OVER (PARTITION BY id ORDER BY p_date
                   ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
            , p_date) AS last_dt
   FROM vt
 ) AS dt

在Postgres中,我会使用
lag()
函数。Teradata支持窗口功能吗?