카운트 최대 시퀀스 행 (Count Max Sequence row)


문제 설명

카운트 최대 시퀀스 행 (Count Max Sequence row)

날짜 정보가 있는 테이블이 있습니다(예: 201501,201502,201510 등). 행은 varchar이지만 yyymm 형식 날짜를 참조합니다.

예:


dates
‑‑‑
201501
201502
201503
201505
201506
201507
201508
201509
201510
201512
201601
201602

시퀀스 월이지만 '201504' 및 '201511'이 누락되었습니다.

각 누락된 날짜까지 rownum을 계산하고 싶습니다. 예: '201504'까지 3행이 있고 '201504' 이후 다음 누락 날짜('201511')까지 6행이 있습니다. 마지막으로 2열입니다.


최대 시퀀스를 원합니다. 이 예제의 출력은 6입니다. 도와주셔서 감사합니다.


참조 솔루션

방법 1:

You can do this with a difference of a row numbers from a months count to assign a group id to the sequences. So, the following identifies such sequences:

select min(d), max(d), count(*)
from (select t.*,
             (to_number(substr(d, 1, 4)) * 12 + to_number(substr(d, 5, 2)) ‑
              row_number() over (order by d)
             ) as grp
      from t
     ) t
group by grp;

You can get the max length as:

with cte as (
      select min(d), max(d), count(*) as len
      from (select t.*,
                   (to_number(substr(d, 1, 4)) * 12 + to_number(substr(d, 5, 2)) ‑ 
                    row_number() over (order by d)
                   ) as grp
            from t
           ) t
      group by grp
     )
select max(len)
from cte;

방법 2:

SQL Fiddle

Oracle 11g R2 Schema Setup:

CREATE TABLE table_name ( dates ) AS
          SELECT 201501 FROM DUAL
UNION ALL SELECT 201502 FROM DUAL
UNION ALL SELECT 201503 FROM DUAL
UNION ALL SELECT 201505 FROM DUAL
UNION ALL SELECT 201506 FROM DUAL
UNION ALL SELECT 201507 FROM DUAL
UNION ALL SELECT 201508 FROM DUAL
UNION ALL SELECT 201509 FROM DUAL
UNION ALL SELECT 201510 FROM DUAL
UNION ALL SELECT 201512 FROM DUAL
UNION ALL SELECT 201601 FROM DUAL
UNION ALL SELECT 201602 FROM DUAL

Query 1:

SELECT MAX( diff ) AS result
FROM (
  SELECT CASE WHEN end_grp IS NOT NULL THEN 1
              ELSE LEAD( end_grp ) IGNORE NULLS OVER ( ORDER BY DATES ) ‑ dates + 1 END as diff
  FROM (
    SELECT DATES,
           CASE next_date WHEN dates+1 THEN NULL ELSE dates END AS end_grp
    FROM (
      SELECT DATES,
             LEAD( DATES ) OVER ( ORDER BY DATES ) AS next_date
      FROM   TABLE_NAME
    )
  )
)

Results:

| RESULT |
|‑‑‑‑‑‑‑‑|
|      6 |

(by Onur CeteGordon LinoffMT0)

참조 문서

  1. Count Max Sequence row (CC BY‑SA 2.5/3.0/4.0)

#oracle #SQL #oracle11g






관련 질문

Oracle SQL은 요일을 현재 날짜로 정렬합니다. (Oracle sql sort week days by current day)

3개의 변수가 있는 저장 프로시저 작성을 위한 plSQL 구문 (plSQL Syntax For Writing Stored Procedure w/ 3 Variables)

조건에 따라 SQL 쿼리의 UPDATE 문에서 값을 설정하기 위해 동적 열 이름을 설정하는 방법은 무엇입니까? (How to set dynamic column name to set value in UPDATE statement of SQL Query on the basis of condition?)

현재 회계 연도부터 sysdate까지 (Current Financial Year to sysdate)

카운트 최대 시퀀스 행 (Count Max Sequence row)

ORA-01008: 모든 변수가 바인딩되지 않았습니다(매개변수화된 쿼리가 있는 테이블 어댑터에서) (ORA-01008: not all variables bound (in table adapter with parameterized query))

ORA-00979: Oracle에 대한 GROUP BY 표현식이 아니지만 절 차이의 컨텍스트에서 MySQL에 대해서는 유효하지 않습니다. (ORA-00979: not a GROUP BY expression for Oracle but not valid for MySQL in context of clause difference)

#SQL #QUERY #ROWNUM #ORACLE (#SQL #QUERY #ROWNUM #ORACLE)

Oracle을 위한 IS숫자 대안 (ISNumeric Alternatives for Oracle)

다른 열의 열에서 누락된 문자 목록을 찾는 방법 (How to find list of missing characters in a column from another column)

18C 업그레이드의 일부로 OWA_UTIL.who_called_me에서 변경된 사항은 무엇입니까? (What are the changes done in OWA_UTIL.who_called_me as part of 18C upgrade?)

일부 값이 null인 경우 Oracle에서 날짜를 비교하시겠습니까? (Compare date in Oracle when some value is null?)







코멘트