Как использовать 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 is VARCHAR2
  • A.V is VARCHAR2
  • B.T is CLOB

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