比较表中的3个连续行

Eos*_*rus 4 sql teradata

嗨,我有一个有趣的问题.我有一个员工表AS跟随

CREATE TABLE EMPLOYEE(
EMPLOYEE_ID INTEGER,
SALARY DECIMAL(18,2),
PAY_PERIOD DATE)
Run Code Online (Sandbox Code Playgroud)

现在,这些表中的员工中有些人每月获得报酬,有些是每周一次,有些是每两周一次,有些是每天一次.我们想要的是如果连续三个支付期的工资相等,找到一个指示'Y'的指标.让我们举个例子.

Employee   Pay_Period     Salary

  1         01/01/2012    $500
  1         08/01/2012    $200
  1         15/01/2012    $200
  1         22/01/2012    $200
  1         29/01/2012    $700
Run Code Online (Sandbox Code Playgroud)

在这种情况下,指标应为"是",因为连续3个工资期的薪水为200美元.

由于支付周期的数量不是恒定的,我不确定如何编写这段代码,因为我不知道我需要多少左连接.因为我在Teradata中写这个我尝试使用RECURSIVE函数但是难倒.关于如何继续这个的一般想法?我宁愿不创建存储过程或具有PL/SQL逻辑.

Rob*_*ler 12

Teradata可能不支持LEAD和LAG,而Oracle和SQL Server现在支持它,但这些功能的前提是基于为Window Aggregate函数选择正确的窗口.在Teradata中,可以使用Window Aggregate Function中的ROWS BETWEEN子句来完成LEAD和LAG.

以下是如何使用ROWS BETWEEN以及桌面上的单个传递来完成您要执行的操作:

CREATE VOLATILE TABLE myTable
( myID SMALLINT NOT NULL,
  PayPeriod DATE NOT NULL,
  PayAmount DECIMAL(5,2) NOT NULL)
PRIMARY INDEX (myID) 
ON COMMIT PRESERVE ROWS;

INSERT INTO myTable VALUES (1, DATE '2012-01-01', 500);
INSERT INTO myTable VALUES (1, DATE '2012-01-08', 200);
INSERT INTO myTable VALUES (1, DATE '2012-01-15', 200);
INSERT INTO myTable VALUES (1, DATE '2012-01-22', 200);
INSERT INTO myTable VALUES (1, DATE '2012-01-29', 700);


SELECT myID
     , PayPeriod
     , PayAmount
     , MAX(PayAmount) OVER (PARTITION BY myID 
                                ORDER BY PayPeriod 
                            ROWS BETWEEN 1 FOLLOWING 
                                     AND 1 FOLLOWING) AS NextPayAmount_
     , MAX(PayAmount) OVER (PARTITION BY myID 
                                ORDER BY PayPeriod 
                            ROWS BETWEEN 2 FOLLOWING 
                                     AND 2 FOLLOWING) AS NextPayAmount2_
     , CASE WHEN NextPayAmount_ = PayAmount
             AND NextPayAmount2_ = PayAmount
            THEN 'Y'
            ELSE 'N'
       END PayIndicator_
  FROM myTable;
Run Code Online (Sandbox Code Playgroud)

结果

1   2012-01-01  500 200 200 N
1   2012-01-08  200 200 200 Y
1   2012-01-15  200 200 700 N
1   2012-01-22  200 700   ? N
1   2012-01-29  700   ?   ? N
Run Code Online (Sandbox Code Playgroud)