sql - 比较表中的 3 个连续行

标签 sql teradata

嗨,我有一个有趣的问题。我有一个员工表如下

CREATE TABLE EMPLOYEE(
EMPLOYEE_ID INTEGER,
SALARY DECIMAL(18,2),
PAY_PERIOD DATE)

现在这些表有员工,他们中的一些人每月获得报酬,一些每周,一些双周和一些每天。我们想要的是找到一个指标,如果三个连续支付期的工资相等,则显示“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

在这种情况下,指标应为是,因为连续 3 个支付期的工资为 200 美元。

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

最佳答案

Teradata 可能不以 Oracle 和 SQL Server 现在支持的方式支持 LEAD 和 LAG,但这些功能的前提是为您的窗口聚合功能选择正确的窗口。在 Teradata 中,可以通过使用窗口聚合函数中的 ROWS BETWEEN 子句来实现 LEAD 和 LAG。

以下是您如何使用 ROWS BETWEEN 和 table 上的单次传递来完成您想要做的事情:

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;

结果
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

关于sql - 比较表中的 3 个连续行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13095338/

相关文章:

sql - 当表连接到自身时,WHERE 子句如何工作?

teradata - 如何识别 Teradata 用户的所有权限?

PHP:array_search 返回 null

python - 在 Pandas Dataframe 上执行 SQL 并将结果存储在同一 Dataframe 中

mysql - 获取与特定行组关联的行的行号

sql - 从同一服务器上不同数据库上的存储过程在 Sybase ASE 数据库上创建 View ?

sql - 将 teradata 时间戳 (6) 转换为 SQL Server 的日期时间

teradata - 创建表失败: [100015] Total size of all parcels is greater than the max message size

sql - 查找/创建一系列跟踪记录的正确结束日期

mysql - MariaDB描述命令错误