2012-10-26 69 views
3

您好我有一個有趣的問題。我有一個僱員表如下比較連續3個表中的行

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邏輯。

+1

在Oracle中,這將是一個LAG在Oracle中功能 – Randy

+0

,你根本就不會被支付。這是Larry()函數。 – wildplasser

回答

11

Teradata數據可能不支持的方式超前滯後,甲骨文和SQL Server支持,但這些功能的前提是基於選擇正確的窗口爲您的窗口集合函數。在Teradata中,可以使用Window Aggregate Function中的ROWS BETWEEN子句完成LEAD和LAG。

這裏是你如何完成你正在尋找在行間使用,並在表中的單個通做什麼:

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 
+1

我喜歡這個解決方案。非常感謝。這非常有用! – Eosphorus

2

的Teradata不具備超前/滯後。但是,它確實有row_number()。所以,你可以做你的想:

with as (
    select e.*, 
      row_number() over (partition by employee_id order by pay_period) as seqnum 
    from employee 
) 
select <whatever you want> 
from emp e join 
    emp e1 join 
    on e.employee_id = e1.employee_id and 
     e.seqnum = e1.seqnum+1 
    emp e2 
    on e.employee_id = e2.employee_id and 
     e.seqnum = e2.seqnum+2 
where e.salary = e1.salary and e.salary = e2.salary 

我有一對夫婦的超出了這個建議。首先,你的employee表應該有每名員工一行,與employee_id主鍵。該表格應該被稱爲EmployeeSalary。其次,你的薪酬期限應該有兩個日期,一個開始和結束日期。