CLOB 열에서 Oracle과 함께 GROUP BY를 사용하는 방법은 무엇입니까?
나는 그것을 결합하려고 노력하고 있습니다.GROUP BYOracle에서 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이라VARCHAR2A.V이라VARCHAR2B.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 |