programing

Oracle FIRST/LAST에서 KEEP에 대한 설명

muds 2023. 8. 4. 23:22
반응형

Oracle FIRST/LAST에서 KEEP에 대한 설명

질문.

KEEP가 정확히 무엇인지, 포함/포함하지 않을 경우의 효과에 대해 설명해 주십시오.

설명을 찾았지만 명확한 설명을 찾을 수 없었습니다.

Oracle에서 유지 여부와 상관없이 파티션 분할

"KEEP"의 실제 포인트/파워는 서로 다른 열을 집계하고 정렬할 때입니다.

절 유지

안타깝게도 "keep" 조항을 검색하기 시작하면 Oracle 문서에서 아무것도 찾을 수 없습니다(그리고 바라건대 이 블로그 게시물 때문에 사람들이 이제 참조를 갖게 될 것입니다).물론 Oracle은 이러한 기능을 문서화합니다.SQL Language Reference에서 첫 번째 및 마지막으로 호출된다는 것만 알면 됩니다.

# However, you can do even better by just adding three "keep clause" functions to the original query:
SELECT
    ra.relation_id,
    MAX(ra.startdate) startdate,
    MAX(ra.address) KEEP(DENSE_RANK LAST ORDER BY ra.startdate) address,
    MAX(ra.postal_code) KEEP(DENSE_RANK LAST ORDER BY ra.startdate) postal_code,
    MAX(ra.city) KEEP(DENSE_RANK LAST ORDER BY ra.startdate) city
FROM
    relation_addresses ra
WHERE
    ra.startdate <= to_date(:reference_date, 'yyyy-mm-dd')
GROUP BY
    ra.relation_id

여기서 제 대답을 바꿔 말하면,

MAX(ra.address) KEEP(DENSE_RANK LAST ORDER BY ra.startdate)

문은 (대략) 오른쪽에서 왼쪽 순서로 고려할 수 있습니다.

  • ORDER BY ra.startdate는 각 의 행을 즉, 각, 룹, 서, 음의 순서로 하는 것을 의미합니다.startdatera 테이블(이시사용드implicit))ASC 순서 그 다음에 (으); ;▁ending면); )그)러
  • KEEP (DENSE_RANK LAST는 각 가 매겨진 행(열한 행에는 순위가 하는 것을 의미합니다.KEEP LAST 즉(순, 있는행가최)이행)startdate); 그리고 마지막으로
  • MAX(ra.address)각 그룹의 나머지 보관 행에 대해 최대 주소를 반환합니다.

최값을찾있다니습을 .address out maximum ( 값을 합니다.startdate그룹에 .


다음을 제외하고는KEEP절:

MAX(ra.startdate)

평최최( 찾의 최대를 찾는 합니다.startdate각 그룹에 대한 열입니다.

참고: 다음 표 이름 relation_addresses를 고려합니다.

relation_id startdate 주소 posta _code city

120-2-2019 2, PVR 파크 879776 탐바람

125-MAY-2020 789, CV 라만나가르 877 876 CV 라만나가르

218-JAN-2018 97, 파리 코너 699776 Ch main.

3 10-MAR-20212/ 2678, 파크 로드 879 776 뱅.

4 12-JUN-2019 89, 테크 파크 638776 테크 파크

503-SEP-2022 309, 파리 모퉁이 거리 673776 Ch main.

517-DEC-2020 77, PVR 하우스 690 960 TN.

  1. ra.relation_id - 각 relation_id를 제공합니다.예를 들어 1

  2. MAX(ra.start date) 시작 날짜 - 관계 ID 1(25-may-2020)에 대한 최대 시작 날짜를 제공합니다.

  3. MAX(ra.address) KEEP(RA.startdate 기준 DENSE_RANK LAST ORDER) 주소 -

    • 주문 기준 ra.startdate - start_date를 오름차순(20-Feb-2019, 25-may-2020)으로 주문합니다.
    • DENSE_RANK LAST - 마지막 시작 날짜(최대 시작 날짜) – (25-5-2020)
    • MAX(ra.address) KEEP(DENSE_RANK LAST ORDER by ra.start date) MAX(ra.address) KEEP(25-may-2020) – 각 시작일 주소 - 789, CV Ramannagar
  4. MAX(ra.postal_code) KEEP(RA.startdate 기준 DENSE_RANK LAST ORDER) post_code -

    • 주문 기준 ra.startdate - start_date를 오름차순(20-Feb-2019, 25-may-2020)으로 주문합니다.
    • DENSE_RANK LAST - 마지막 시작 날짜(최대 시작 날짜) – (25-5-2020)
    • MAX(ra.postal_code) KEEP(DENSE_RANK LAST ORDER by ra.start date) MAX(ra.address) KEEP(25-may-2020) – 각 시작일 주소 - 877876
  5. MAX(ra.city) KEEP(ra.startdate 기준 DENSE_RANK LAST ORDER) 도시 -

    • 주문 기준 ra.startdate - start_date를 오름차순(20-Feb-2019, 25-may-2020)으로 주문합니다.
    • DENSE_RANK LAST - 마지막 시작 날짜(최대 시작 날짜) – (25-5-2020)
    • MAX(ra.city) KEEP(DENSE_RANK LAST ORDER by ra.start date) MAX(ra.address) KEEP(25-may-2020) – 각 시작일 주소 - CV Ramannagar

GROUP BY ra.relation_id – 출력은 relation_id에 의한 그룹 기준으로 제공됩니다.

최종 출력은 다음과 같습니다.

relation_id startdate 주소 posta _code city

125-MAY-2020 789, CV 라만나가르 877 876 CV 라만나가르

218-JAN-2018 97, 파리 코너 699776 Ch main.

3 10-MAR-20212/ 2678, 파크 로드 879 776 뱅.

4 12-JUN-2019 89, 테크 파크 638776 테크 파크

517-DEC-2020 77, PVR 하우스 690 960 TN.

언급URL : https://stackoverflow.com/questions/65866812/explanation-of-keep-in-oracle-first-last

반응형