[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.테라 데이타는 당신의 창 집계 함수에 대한 올바른 창을 선택을 기반으로 오라클과 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.테라 데이타는 리드 / 지연이 없습니다. 그러나, 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과 같이 호출해야합니다. 둘째, 당신의 지불 기간은 두 날짜하는 시작과 끝 날짜를 가져야한다.
from https://stackoverflow.com/questions/13095338/compare-3-consecutive-rows-in-a-table by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 열이 시작하거나 문자로 끝날 수있을 때 부호로 캐스트 수치 MySQL의 정렬 VARCHAR 열을 사용하여 (0) | 2020.07.09 |
---|---|
[SQL] 당신은 어떻게 변수를 사용하여 동적 쿼리에서 IN 절을 지정합니까? (0) | 2020.07.09 |
[SQL] MySQL의 카운트 성능 (0) | 2020.07.09 |
[SQL] C #을 LINQ에서 구현 RANK OVER SQL 조항 (0) | 2020.07.09 |
[SQL] sp_MSforeachdb : 결과 만에 데이터베이스에서 결과를 포함 (0) | 2020.07.09 |