[SQL] 서열 값에 의해 그룹
SQL서열 값에 의해 그룹
나는이 같은 일부 테이블이
row chequeNo
1 15
2 19
3 20
4 35
5 16
나는이 같은 결과를 얻을 필요
row from to
1 15 16
2 19 20
3 35 35
그래서 값이 어떤 중단없이 연속 될 것이다 chequeNo 그룹이 필요합니다. chequeNo 고유 열입니다. 내가 선택 쿼리를 제외한 모든 SQL 구조를 만들 수없는 권한을 가지고 있기 때문에 또한 쿼리를 선택 SQL 하나를 수행해야합니다.
그래서 가능할까요?
어떤 도움 감사 드리겠습니다
해결법
-
==============================
1.당신은 Jyuuzou의 기술을 앉아서 사용할 수 있습니다 여기 Tabibitosan라고 :
당신은 Jyuuzou의 기술을 앉아서 사용할 수 있습니다 여기 Tabibitosan라고 :
SQL> create table mytable (id,chequeno) 2 as 3 select 1, 15 from dual union all 4 select 2, 19 from dual union all 5 select 3, 20 from dual union all 6 select 4, 35 from dual union all 7 select 5, 16 from dual 8 / Table created. SQL> with tabibitosan as 2 ( select chequeno 3 , chequeno - row_number() over (order by chequeno) grp 4 from mytable 5 ) 6 select row_number() over (order by grp) "row" 7 , min(chequeno) "from" 8 , max(chequeno) "to" 9 from tabibitosan 10 group by grp 11 / row from to ---------- ---------- ---------- 1 15 16 2 19 20 3 35 35 3 rows selected.
문안 인사, 롭.
-
==============================
2.이것은 오라클 (10)와 함께 작동합니다 (오라클 만 11 테스트)
이것은 오라클 (10)와 함께 작동합니다 (오라클 만 11 테스트)
select group_nr + 1, min(chequeno) as start_value, max(chequeno) as end_value from ( select chequeno, sum(group_change_flag) over (order by rn) as group_nr from ( select row_number() over (order by chequeno) as rn, chequeno, case when chequeno - lag(chequeno,1,chequeno) over (order by chequeno) <= 1 then 0 else 1 end as group_change_flag from foo ) t1 ) t2 group by group_nr order by group_nr
(이 작업을해야 기능을 윈도 표준 SQL을 지원하는 모든 DBMS, 예를 들어, PostgreSQL을, DB2, 2012 SQL 서버)
-
==============================
3.여기에 "일반 바닐라"접근 방식은 다음과 같습니다
여기에 "일반 바닐라"접근 방식은 다음과 같습니다
SELECT T1.chequeNo, T2.chequeNo FROM Table1 AS T1 INNER JOIN Table1 AS T2 ON T2.chequeNo >= T1.chequeNo WHERE NOT EXISTS (SELECT T0.chequeNo FROM Table1 T0 WHERE T0.chequeNo IN ((T1.chequeNo-1), (T2.chequeNo+1))) AND (SELECT COUNT(*) FROM Table1 T0 WHERE T0.chequeNo BETWEEN T1.chequeNo AND T2.chequeNo)=(T2.chequeNo - T1.chequeNo + 1) ORDER BY 1,2
이 대용량 데이터 세트에 대한 너무 비효율적 있으면 알려 주시기 바랍니다.
-
==============================
4.
CREATE TABLE YOUR_TABLE ( chequeNo NUMBER PRIMARY KEY ); INSERT INTO YOUR_TABLE VALUES (15); INSERT INTO YOUR_TABLE VALUES (19); INSERT INTO YOUR_TABLE VALUES (20); INSERT INTO YOUR_TABLE VALUES (35); INSERT INTO YOUR_TABLE VALUES (16); SELECT T1.chequeNo "from", T2.chequeNo "to" FROM ( SELECT chequeNo, ROW_NUMBER() OVER (ORDER BY chequeNo) RN FROM ( SELECT chequeNo, LAG(chequeNo) OVER (ORDER BY chequeNo) PREV FROM YOUR_TABLE ) WHERE PREV IS NULL OR chequeNo > PREV + 1 ) T1 JOIN ( SELECT chequeNo, ROW_NUMBER() OVER (ORDER BY chequeNo) RN FROM ( SELECT chequeNo, LEAD(chequeNo) OVER (ORDER BY chequeNo) NEXT FROM YOUR_TABLE ) WHERE NEXT IS NULL OR chequeNo < NEXT - 1 ) T2 USING (RN);
결과:
from to ---------------------- ---------------------- 15 16 19 20 35 35
우리는 약간까지 가지 양념을하면 ...
INSERT INTO YOUR_TABLE VALUES (17); INSERT INTO YOUR_TABLE VALUES (18);
... 우리가 얻을 :
from to ---------------------- ---------------------- 15 20 35 35
from https://stackoverflow.com/questions/9977371/group-by-values-that-are-in-sequence by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 열 이름을 가져옵니다 (0) | 2020.07.02 |
---|---|
[SQL] C #에서 저장된 프로 시저에서 여러 레코드를 반환 (0) | 2020.07.02 |
[SQL] SQLite는 날짜를 비교 (0) | 2020.07.02 |
[SQL] 오라클 SQL Developer를 사용하여 텍스트 파일에 CLOB 내보내기 (0) | 2020.07.02 |
[SQL] INSERT INTO는 그렇지 않은 경우 SQL 서버에 존재 (0) | 2020.07.02 |