복붙노트

[SQL] 테이블에 연속 3 개 행을 비교

SQL

테이블에 연속 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 급여가 예 있기 때문에해야합니다.

지불 기간의 수는 일정하지 않기 때문에 나는 왼쪽 내가 need.Since 나는 재귀 함수를 사용하여 테라 데이타 I에서 이것을 시도 쓰고 있어요하지만 난처한 상황에 빠진있어 조인 얼마나 많은 손 전에서 알 수 없기 때문에이 코드를 작성하는 방법이 확실하지 . 이 진행하는 방법에 대한 일반적인 아이디어? 내가 저장 프로 시저를 작성 또는 PL / SQL 로직을 가지고 있지 선호하는 것이다.

해결법

  1. ==============================

    1.테라 데이타는 당신의 창 집계 함수에 대한 올바른 창을 선택을 기반으로 오라클과 SQL 서버 지금하지만 이러한 기능의 전제를 지원하는 방식으로 LEAD 및 LAG를 지원하지 않을 수 있습니다. 테라 데이타 LEAD 및 LAG에서 당신의 창 집계 기능에 절 사이의 행을 사용하여 수행 할 수 있습니다.

    테라 데이타는 당신의 창 집계 함수에 대한 올바른 창을 선택을 기반으로 오라클과 SQL 서버 지금하지만 이러한 기능의 전제를 지원하는 방식으로 LEAD 및 LAG를 지원하지 않을 수 있습니다. 테라 데이타 LEAD 및 LAG에서 당신의 창 집계 기능에 절 사이의 행을 사용하여 수행 할 수 있습니다.

    여기에 당신이 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;
    

    결과

    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
    
  2. ==============================

    2.테라 데이타는 리드 / 지연이 없습니다. 그러나, ROW_NUMBER가 않습니다 (). 그래서, 당신은 당신이 아니라 원하는 것을 할 수 있습니다 :

    테라 데이타는 리드 / 지연이 없습니다. 그러나, 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_id입니다의 기본 키, 직원 당 하나 개의 행이 있어야합니다. 이 테이블은 EmployeeSalary과 같이 호출해야합니다. 둘째, 당신의 지불 기간은 두 날짜하는 시작과 끝 날짜를 가져야한다.

  3. from https://stackoverflow.com/questions/13095338/compare-3-consecutive-rows-in-a-table by cc-by-sa and MIT license