복붙노트

[SQL] 어떻게 윈도우 함수에서 링 데이터 구조를 사용하는

SQL

어떻게 윈도우 함수에서 링 데이터 구조를 사용하는

I는 그것이 그 사이클 시퀀스로 표현 될 수있다, 환 구조 (또는 원형 버퍼)에 배치되는 데이터를 가지고 ...- 1-2-3-4-5-1-2-3 -... . 5 부 반지의 아이디어를 얻을이 사진을 참조하십시오 :

나는 세 점의 배열에 지연과 리드 항목을 결합 할 수있는 창 조회를 작성하고 싶습니다,하지만 난 그것을 알아낼 수 없습니다. 5 부 고리의 1 부에서 예를 들어, 지연 / 납 시퀀스 5-1-2, 또는 부분 (4) 3-4-5이다.

여기에 부품 (링마다 항상 개 이상)의 수가 다른 두 개의 링의 예 테이블은 다음과 같습니다

create table rp (ring int, part int);
insert into rp(ring, part) values(1, generate_series(1, 5));
insert into rp(ring, part) values(2, generate_series(1, 7));

여기에 거의 성공 쿼리는 다음과 같습니다

SELECT ring, part, array[
    lag(part, 1, NULL) over (partition by ring),
    part,
    lead(part, 1, 1) over (partition by ring)
    ] AS neighbours
FROM rp;

 ring | part | neighbours
------+------+------------
    1 |    1 | {NULL,1,2}
    1 |    2 | {1,2,3}
    1 |    3 | {2,3,4}
    1 |    4 | {3,4,5}
    1 |    5 | {4,5,1}
    2 |    1 | {NULL,1,2}
    2 |    2 | {1,2,3}
    2 |    3 | {2,3,4}
    2 |    4 | {3,4,5}
    2 |    5 | {4,5,6}
    2 |    6 | {5,6,7}
    2 |    7 | {6,7,1}
(12 rows)

나는이해야 할 유일한 것은 마지막 값 각 링의 끝 지점으로 NULL을 대체하는 것입니다. 이제, 지연 및 리드 윈도우 함수와 함께 이상적 일 것 LAST_VALUE 기능이있다. 그러나 이러한 중첩 될 수 없습니다 :

SELECT ring, part, array[
    lag(part, 1, last_value(part) over (partition by ring)) over (partition by ring),
    part,
    lead(part, 1, 1) over (partition by ring)
    ] AS neighbours
FROM rp;
ERROR:  window function calls cannot be nested
LINE 2:     lag(part, 1, last_value(part) over (partition by ring)) ...

최신 정보. 사용 합체 저스틴의 제안이 중첩 윈도우 기능을 피하기 위해 @ 감사합니다. 또한, 성 / 값이 예를 들어 부분 우연히 링 시퀀스에 의해 명시 적으로 순서가 필요 많은 사람들에 의해 지적되었다. 입력 데이터를 조금 무작위 화 그래서 :

create table rp (ring int, part int);
insert into rp(ring, part) select 1, generate_series(1, 5) order by random();
insert into rp(ring, part) select 2, generate_series(1, 7) order by random();

해결법

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

    1.

  2. ==============================

    2.질문:

    질문:

    SQL 뿐인 예

    SELECT ring, part, array[
        coalesce(lag(part, 1, NULL) over (partition by ring), 
                 max(part) over (partition by ring)),
        part,
        lead(part, 1, 1) over (partition by ring)
        ] AS neighbours
    FROM rp;
    

    결과:

    | RING | PART | NEIGHBOURS |
    |------|------|------------|
    |    1 |    1 |      5,1,2 |
    |    1 |    2 |      1,2,3 |
    |    1 |    3 |      2,3,4 |
    |    1 |    4 |      3,4,5 |
    |    1 |    5 |      4,5,1 |
    |    2 |    1 |      7,1,2 |
    |    2 |    2 |      1,2,3 |
    |    2 |    3 |      2,3,4 |
    |    2 |    4 |      3,4,5 |
    |    2 |    5 |      4,5,6 |
    |    2 |    6 |      5,6,7 |
    |    2 |    7 |      6,7,1 |
    
  3. from https://stackoverflow.com/questions/25030179/how-to-use-a-ring-data-structure-in-window-functions by cc-by-sa and MIT license