CLOB 열에서 Oracle과 함께 GROUP BY를 사용하는 방법은 무엇입니까?
나는 그것을 결합하려고 노력하고 있습니다.GROUP BY
Oracle에서 MAX를 사용하는 함수입니다.문서를 많이 읽었는데 오라클에서 요청을 포맷하는 방법을 알아내려고 항상 다음과 같이 답합니다.
ORA-00979: "식으로 그룹이 아님"
제 요청은 다음과 같습니다.
SELECT A.T_ID, B.T, MAX(A.V)
FROM bdd.LOG A, bdd.T_B B
WHERE B.T_ID = A.T_ID
GROUP BY A.T_ID
HAVING MAX(A.V) < '1.00';
팁 있어요?
편집 내 필드의 데이터 유형과 관련하여 까다로운 부분이 있는 것 같습니다.
T_ID
이라VARCHAR2
A.V
이라VARCHAR2
B.T
이라CLOB
저는 당신이 원하는 것과 거의 완전히 다른 것을 하기 위해 다른 사람이 설계한 테이블에 대한 질의를 작성하는 현상에 매우 익숙합니다.저도 같은 문제를 겪었을 때, 저는 사용했습니다.
GROUP BY TO_CHAR(theclob)
그리고 물론 당신은 그래야 합니다.TO_CHAR
당신의 출력에도 클롭이 있습니다.
이 문제에는 두 가지 수준이 있습니다.첫 번째는 당신이 클럽일 필요가 없는 클럽 칼럼을 가지고 있다는 것입니다; 그것은 단지 적합한 약간의 작은 문자열만 가지고 있습니다.VARCHAR2
여기에는 제 해결 방법이 적용됩니다.
두 번째 수준은 실제로 큰 문자열이 포함된 열을 기준으로 그룹화하려는 것입니다.그런 경우에는TO_CHAR
아마 도움이 되지 않을 것입니다.
사용해 보십시오.
SELECT A.T_ID, B.T, MAX(A.V)
FROM bdd.LOG A, bdd.T_B B
WHERE B.T_ID = A.T_ID
GROUP BY A.T_ID, B.T
HAVING MAX(A.V) < 1;
몇 가지 수정 후에 주요 문제는 다음 문제가 발생한 것 같습니다.group by
에서 동일한 테이블을 사용해야 합니다.SELECT
그리고 그 안에GROUP BY
저는 또한 작동하기 위해 CLOB의 일부만을 사용합니다.작업 요청:
SELECT TABLE_A.ID,
TABLE_A.VA,
B.TRACE
FROM
(SELECT A.T_ID ID,
MAX(A.V) VA
FROM BDD.LOG A
GROUP BY A.T_ID HAVING MAX(A.V) <= '1.00') TABLE_A,
BDD.T B
WHERE TABLE_A.ID = B.T_id;
이 응답은 약간 늦지만 그룹화 값과 최대 기준 열 이외의 값이 필요한 경우 파티션에서 ROW_NUMBER()를 사용하여 원하는 것을 얻을 수 있습니다.
SELECT T_ID, T, V
FROM
(
SELECT A.T_ID, B.T, A.V, ROW_NUMBER() OVER (PARTITION BY A.T_ID ORDER BY to_number(A.V) DESC) rownumber
FROM bdd.LOG A, bdd.T_B B
WHERE B.T_ID = A.T_ID
)
WHERE rownumber = 1
최대값을 가져오려면 ORDER BY의 DESC 수식어를 잊지 마십시오. 최대값이 없으면 최소값이 됩니다.A.V가 null일 경우 NVL()로 묶어야 하거나 NULL을 얻을 수 있습니다. NULL 값은 오름차순 또는 내림차순을 선택하든 상관없이 항상 먼저 정렬됩니다(최소한 Oracle SQL에서는).
가능한 경우 클로브를 PK로 변환하고 PK의 선택으로 변환할 수 있습니다.실행 계획에 따르면 이것은 rowid보다 훨씬 빠릅니다.나는 이 경우에 첫 번째가 아닌 빈 뭉치가 필요합니다.그래서 나는 만약 clob이 비어있지 않다면 pk 그렇지 않으면 null을 사용한다고 말합니다.결과는 clob이 아니며 외부 쿼리에서 clob을 가져올 수 있습니다.
select a.* ,r.DESCRIPTION
from (
select distinct
FIRST_VALUE(
case
when a.DESCRIPTION is null then null
else PK_COL
end
IGNORE NULLS)
OVER (ORDER BY a.sort_col desc ROWS between UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) DESCRIPTION_PK,
group_column
from reporting a where group_column='xyz) a
join reporting r on (r.PK_COL=a.DESCRIPTION_PK);
이것은 OP의 문제를 해결하지 못하지만, 경우에 따라 도움이 될 수 있습니다.
우리가 갖자!
CREATE TABLE "TEST" (
ID NUMBER,
DATA CLOB
);
실제 CLOB 데이터가 4,000자를 초과하지 않으면 다음을 사용하여 변환할 수 있습니다.TO_CHAR
그런 다음 필요한 그룹화를 수행합니다.
SELECT
DATA_AS_CHAR,
COUNT(*)
FROM
(
SELECT
ID,
TO_CHAR(DATA) DATA_AS_CHAR
FROM TEST
)
GROUP BY
DATA_AS_CHAR;
이 값을 초과하는 경우 처음 4000자를 하위 문자열로 지정하는 등 몇 가지 휴리스틱을 적용해야 합니다.
SELECT
DATA_AS_CHAR,
COUNT(*)
FROM
(
SELECT
ID,
TO_CHAR(DBMS_LOB.SUBSTR(DATA, 4000)) DATA_AS_CHAR
FROM TEST
)
GROUP BY
DATA_AS_CHAR;
다른 해싱 기법과 마찬가지로 충돌이 발생할 수 있습니다(그룹 수가 예상보다 적음).
WITH foo as (
SELECT A.T_ID, B.T, MAX(A.V) maxav
FROM bdd.LOG A, bdd.T_B B
WHERE B.T_ID = A.T_ID
GROUP BY A.T_ID, B.T
)
SELECT * FROM foo WHERE maxav < 1
언급URL : https://stackoverflow.com/questions/20678881/how-to-use-group-by-on-a-clob-column-with-oracle
'source' 카테고리의 다른 글
양식 제출에서 제출 사용 안 함 단추 (0) | 2023.08.15 |
---|---|
파워셸에서 크롬 개체 인스턴스화 (0) | 2023.08.15 |
전화 번호를 허용하는 입력에 대한 마스크? (0) | 2023.08.15 |
장고 >= 3.1 및 is_dll (0) | 2023.08.15 |
자바.java.javaNoClassDefFoundError: org/springframework/data/repository/config/BootstrapMode (0) | 2023.08.15 |