2017-12-13 14 views
0

에서 다음 값을 찾을 수 있습니다 :PostgreSQL의 분석 함수의 윈도우 내가 다음과 같은 PostgreSQL의를 사용하여 만든 데이터 집합을 열

SELECT T.* 

FROM 

(
WITH REF_TABLE AS 
(
SELECT 22 AS "UNIT", 1 AS "CYCLE", 5.3 AS "FIRST_SHIFT", 9.56 AS "LAST_SHIFT", 1 AS "ROUTE" FROM DUAL 
UNION 
SELECT 22 AS "UNIT", 1 AS "CYCLE", 5.3 AS "FIRST_SHIFT", 9.56 AS "LAST_SHIFT", 2 AS "ROUTE" FROM DUAL 
UNION 
SELECT 22 AS "UNIT", 1 AS "CYCLE", 5.3 AS "FIRST_SHIFT", 9.56 AS "LAST_SHIFT", 3 AS "ROUTE" FROM DUAL 
UNION 
SELECT 22 AS "UNIT", 1 AS "CYCLE", 5.3 AS "FIRST_SHIFT", 9.56 AS "LAST_SHIFT", 4 AS "ROUTE" FROM DUAL 
UNION 
SELECT 22 AS "UNIT", 2 AS "CYCLE", 3.8 AS "FIRST_SHIFT", 6.25 AS "LAST_SHIFT", 1 AS "ROUTE" FROM DUAL 
UNION 
SELECT 22 AS "UNIT", 2 AS "CYCLE", 3.8 AS "FIRST_SHIFT", 6.25 AS "LAST_SHIFT", 3 AS "ROUTE" FROM DUAL 
UNION 
SELECT 22 AS "UNIT", 3 AS "CYCLE", 7.0 AS "FIRST_SHIFT", 10.05 AS "LAST_SHIFT", 1 AS "ROUTE" FROM DUAL 
UNION 
SELECT 22 AS "UNIT", 3 AS "CYCLE", 7.0 AS "FIRST_SHIFT", 10.05 AS "LAST_SHIFT", 2 AS "ROUTE" FROM DUAL 
UNION 
SELECT 22 AS "UNIT", 3 AS "CYCLE", 7.0 AS "FIRST_SHIFT", 10.05 AS "LAST_SHIFT", 3 AS "ROUTE" FROM DUAL 
UNION 
SELECT 22 AS "UNIT", 3 AS "CYCLE", 7.0 AS "FIRST_SHIFT", 10.05 AS "LAST_SHIFT", 4 AS "ROUTE" FROM DUAL 
UNION 
SELECT 22 AS "UNIT", 3 AS "CYCLE", 7.0 AS "FIRST_SHIFT", 10.05 AS "LAST_SHIFT", 5 AS "ROUTE" FROM DUAL 
UNION 
SELECT 22 AS "UNIT", 4 AS "CYCLE", 4.3 AS "FIRST_SHIFT", 8.10 AS "LAST_SHIFT", 4 AS "ROUTE" FROM DUAL 
UNION 
SELECT 22 AS "UNIT", 4 AS "CYCLE", 4.3 AS "FIRST_SHIFT", 8.10 AS "LAST_SHIFT", 5 AS "ROUTE" FROM DUAL 
UNION 
SELECT 22 AS "UNIT", 4 AS "CYCLE", 4.3 AS "FIRST_SHIFT", 8.10 AS "LAST_SHIFT", 8 AS "ROUTE" FROM DUAL 
) 
SELECT * FROM REF_TABLE 
) 
T 

Dataset

UNIT | CYCLE | FIRST_SHIFT | LAST_SHIFT | ROUTE 
------+-------+-------------+------------+------- 
    22 |  1 |   5.3 |  9.56 |  1 
    22 |  1 |   5.3 |  9.56 |  2 
    22 |  1 |   5.3 |  9.56 |  3 
    22 |  1 |   5.3 |  9.56 |  4 
    22 |  2 |   3.8 |  6.25 |  1 
    22 |  2 |   3.8 |  6.25 |  3 
    22 |  3 |   7.0 |  10.05 |  1 
    22 |  3 |   7.0 |  10.05 |  2 
    22 |  3 |   7.0 |  10.05 |  3 
    22 |  3 |   7.0 |  10.05 |  4 
    22 |  3 |   7.0 |  10.05 |  5 
    22 |  4 |   4.3 |  8.10 |  4 
    22 |  4 |   4.3 |  8.10 |  5 
    22 |  4 |   4.3 |  8.10 |  8 

내가 할 수없는 운동 권리 PostgreSQL의 분석을 함수 (LEAD, LAG 또는 FIRST_VALUE, LAST_VALUE)이 데이터 세트에 대한 윈도우; 다음으로하지만 는 출력을 생성 싶습니다

enter image description here

+0

출력이 좋음을 보여줍니다 (이미지가 아닌 경우 더 좋음).하지만 원하는 b를 기술한다. 말로 행동한다. –

+0

'SELECT ... FROM DUAL'은 실제로 Oracle을 사용하고있는 것처럼 들립니다. –

답변

0

그때 내가 여기에 사각형 바퀴를 발명하고있어 확실히 더 해요,하지만 경우에 아무도 당신에게 일반 솔루션주지 :

t=# with a as (
    select * 
, case when r = max(r) over (partition by u,c,f) then row_number() over() else 0 end casex 
, case when r = min(r) over (partition by u,c,f) then row_number() over() else 0 end casen 
, lead(f) over (partition by u order by u,c) 
, lag(l) over (partition by u order by u,c) 
from t 
) 
, b as (
    select * 
    , max("casex") over(partition by u,c) x 
    , max("casen") over(partition by u,c) n 
    from a 
) 
select u,c,f,l,r 
, nth_value("lead","x"::int) over() 
, nth_value("lag","n"::int) over() 
from b; 
u | c | f | l | r | nth_value | nth_value 
----+---+-----+-------+---+-----------+----------- 
22 | 1 | 5.3 | 9.56 | 1 |  3.8 | 
22 | 1 | 5.3 | 9.56 | 2 |  3.8 | 
22 | 1 | 5.3 | 9.56 | 3 |  3.8 | 
22 | 1 | 5.3 | 9.56 | 4 |  3.8 | 
22 | 2 | 3.8 | 6.25 | 1 |  7.0 |  9.56 
22 | 2 | 3.8 | 6.25 | 3 |  7.0 |  9.56 
22 | 3 | 7.0 | 10.05 | 1 |  4.3 |  6.25 
22 | 3 | 7.0 | 10.05 | 2 |  4.3 |  6.25 
22 | 3 | 7.0 | 10.05 | 3 |  4.3 |  6.25 
22 | 3 | 7.0 | 10.05 | 4 |  4.3 |  6.25 
22 | 3 | 7.0 | 10.05 | 5 |  4.3 |  6.25 
22 | 4 | 4.3 | 8.10 | 4 |   |  10.05 
22 | 4 | 4.3 | 8.10 | 5 |   |  10.05 
22 | 4 | 4.3 | 8.10 | 8 |   |  10.05 
(14 rows) 

다시 한 번 단계별 논리적 선택을 코딩했지만 여기에 바로 가기 방법이있는 수학적 트릭이 있다고 확신합니다.