Как использовать 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_IDisVARCHAR2 - 
A.VisVARCHAR2 - 
B.TisCLOB 
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) независимо от того, если вы выбрать по возрастанию или по убыванию.