Как использовать GROUP BY в столбце CLOB с Oracle?
Я пытаюсь объединить GROUP BY
функция с максимальным значением в oracle. Я читаю много документов вокруг, пытаюсь выяснить, как отформатировать мой запрос Oracle всегда возвращает:
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
isVARCHAR2
-
A.V
isVARCHAR2
-
B.T
isCLOB
5 ответов
Я очень хорошо знаком с феноменом написания запросов для таблицы, разработанной кем-то другим, чтобы сделать что-то почти полностью отличное от того, что вы хотите. Когда у меня была такая же проблема, я использовал.
GROUP BY TO_CHAR(theclob)
и тогда, конечно, надо TO_CHAR
clob в ваших выходах тоже.
обратите внимание, что есть 2 уровня эта проблема... во-первых, у вас есть столбец clob, который не должен быть clob; он содержит только небольшие строки, которые подходят в 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;
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
этот ответ немного запоздал, но для тех, кому нужны значения помимо значения группировки и столбца максимальных критериев, вы можете использовать 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
Не забудьте модификатор DESC в заказе, чтобы получить максимальное значение; без него вы получите минимальное значение. Если A. V nullable, вам также нужно будет обернуть его в NVL() или вы просто получите NULLs; значения NULL всегда сортируются первыми (по крайней мере, в Oracle SQL) независимо от того, если вы выбрать по возрастанию или по убыванию.