2015-05-29 2 views
2

Необходимо найти минимальное и максимальное дата внутри списка теге Как это в один колонке Min Дата: 01/01/2015/Max Дата: 01/05/2015SQL LISTAGG Min и Max Функция Выпуск

SELECT D.ITEM_ID AS "ItemId", 
     C.NAME AS "ItemName", 
     D.UOM_ID AS "UomId", 
     B.DESCRIPTION AS "Uom", 
     sum(D.REQUIRED_QTY) AS "Quantity", 
     LISTAGG(A.REASON, ', ') WITHIN GROUP (ORDER BY A.REASON) "ReasonType", 
     LISTAGG(D.REQUIRED_DATE, ', ') WITHIN GROUP (ORDER BY D.REQUIRED_DATE) "PoRequiredDate", 
     LISTAGG(D.PO_COMMENT, ', ') WITHIN GROUP (ORDER BY D.PO_COMMENT) "Comment" 
FROM BIZZXE_V2_SCH.REASONS A, 
    BIZZXE_V2_SCH.UOMS B, 
    BIZZXE_V2_SCH.ITEMS C, 
    BIZZXE_V2_SCH.PO_REQUEST_ITEMS D, 
    BIZZXE_V2_SCH.PO_REQUESTS E 
WHERE E.PO_REQUEST_ID=D.PO_REQUEST_ID 
    AND D.ITEM_ID=C.ITEM_ID 
    AND D.UOM_ID=B.UOM_ID 
    AND D.REASON_ID=A.REASON_ID 
GROUP BY D.ITEM_ID, C.NAME, D.UOM_ID, B.DESCRIPTION 

нужно добавить Min АДС и Макс дт в одну колонку, как «PoRequiredDate»

WITH DATA AS(
    SELECT listagg(REQUIRED_DATE, ',') WITHIN GROUP (ORDER BY REQUIRED_DATE) dt 
    FROM PO_REQUEST_ITEMS 
    WHERE PO_REQUEST_ID =16 

) 
SELECT dt, 
     SUBSTR(dt, 1, instr(dt, ',', 1, 1)-1) min_dt, 
     SUBSTR(dt, instr(dt, ',', -1, 1)+1) max_dt 
    FROM data 
/

ответ

0

Вы можете использовать синтаксис «СОХРАНИТЬ (DENSE_RANK FIRST/L АСТ ...)»для вашей цели:

'Min Date: '||min(REQUIRED_DATE) KEEP (DENSE_RANK FIRST ORDER BY REQUIRED_DATE) || 
'/Max Date: '||min(REQUIRED_DATE) KEEP (DENSE_RANK LAST ORDER BY REQUIRED_DATE NULLS FIRST) 

Основные вопросы есть FIRST и LAST ключевых слов - они агрегатные или аналитические функции. KEEP указывает, что в выражении будут использоваться либо FIRST, либо LAST. DENSE_RANK указывает, что база данных будет использовать только те значения, которые имеют минимальный (FIRST) или максимальный (LAST) плотный ранг. Расчет плотного ранжирования основан на сортировке, которая устанавливается ЗАКАЗ   BY статья.

Обратите внимание, что в вашем случае не имеет значения, используете ли вы MIN или MAX в основном выражении. Это связано с тем, что описанная выше функция «KEEP ... DENSE_RANK ... FIRST/LAST» переходит к агрегатной функции (MIN/MAX) только к тем записям, которые уже имеют экстремальные значения.

+0

спасибо, что я действительно искал – Beez

+1

Добавил более подробную информацию и исправил возможную ошибку с помощью значений NULL, добавив «NULLS FIRST». – BitLord

+0

спасибо за это – Beez

0

так что вы хотите MIN и MAX даты агрегированных значений выхода LISTAGG.

Поскольку LISTAGG всегда будет иметь упорядоченные значения, дата мин будет первый элемент в разделенных запятыми списке, и дата макс будет последний элемент в каждая группа.

Таким образом, все, что вам нужно использовать это:

  • SUBSTR
  • INSTR

Например,

SQL> WITH DATA AS(
    2 SELECT deptno, listagg(hiredate, ',') WITHIN GROUP (ORDER BY deptno) dt 
    3 FROM emp 
    4 WHERE deptno <> 30 
    5 GROUP BY deptno 
    6 ) 
    7 SELECT deptno, 
    8   dt, 
    9   SUBSTR(dt, 1, instr(dt, ',', 1, 1)-1) min_dt, 
10   SUBSTR(dt, instr(dt, ',', -1, 1)+1) max_dt 
11 FROM data 
12/

    DEPTNO DT              MIN_DT   MAX_DT 
---------- ------------------------------------------------------- --------------- ---------- 
     10 1981-06-09,1981-11-17,1982-01-23      1981-06-09  1982-01-23 
     20 1980-12-17,1981-04-02,1981-12-03,1982-12-09,1983-01-12 1980-12-17  1983-01-12 

SQL> 
+0

Мне нужно Min_Dt и Max_Dt для одного столбца – Beez

+0

@ user3359056 Тогда просто еще один шаг, просто примените 'MIN' и' MAX' в новых столбцах min_dt и max_dt. –

+0

Я не понял, что вы сказали «Тогда просто еще один шаг, просто примените MIN и MAX к новым столбцам min_dt и max_dt». – Beez