반응형
순서에 따라 값을 그룹화합니다.
이런 테이블이 있습니다.
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 select 쿼리 하나로 수행해야 합니다. select 쿼리 외에는 sql 구조를 만들 수 있는 권한이 없기 때문입니다.
그래서 가능할까요?
도움을 주시면 감사하겠습니다.
당신은 여기서 타비비토산이라고 불리는 아케티 쥬우조의 기술을 사용할 수 있습니다.
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.
안부 전해요,
롭
Oracle 10에서 작동해야 합니다(Oracle 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, SQL Server 2012)
여기 "일반 바닐라" 접근법이 있습니다.
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
대용량 데이터 세트에 너무 비효율적이면 알려주시기 바랍니다.
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
언급URL : https://stackoverflow.com/questions/9977371/group-by-values-that-are-in-sequence
반응형
'programing' 카테고리의 다른 글
Invoke-WebRequest SSL이 실패합니까? (0) | 2023.08.27 |
---|---|
용기 끝에 마지막 플렉스 항목 배치 (0) | 2023.08.27 |
CGSize 개체의 값을 인쇄하거나 기록하는 방법은 무엇입니까? (0) | 2023.08.27 |
양식 제출 jQuery에서 기본값 방지 (0) | 2023.08.27 |
iTunes Connect API (0) | 2023.08.27 |