2015-05-29 69 views
2

需要找到最小和最大日期列表標籤 像這樣在裏面一列敏日期:2015年1月1日/最大日期:2015年1月5日SQL LISTAGG最小和最大功能問題

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 

需要DT加民dt和最高一列作爲「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

你可以使用語法「KEEP (DENSE_RANK FIRST/L AST ...)」你的目的:

'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) 

的主要問題有FIRSTLAST關鍵字 - 他們聚集或分析功能。 KEEP表示在表達中使用FIRST或LAST。 DENSE_RANK表示數據庫將僅使用那些具有最小(FIRST)或最大(LAST)密集等級的值。稠密等級計算基於排序,其由設置ORDER   BY子句。

注意,在你的情況下,如果你在主表達式中使用MIN或MAX並不重要。這是因爲上面描述的函數「KEEP ... DENSE_RANK ... FIRST/LAST」只傳遞給聚合函數(MIN/MAX),只有那些已經有極端值的記錄。

+0

謝謝你這是我搜索 – Beez

+1

添加更多細節並通過添加「NULLS FIRST」修復NULL值的可能錯誤。 – BitLord

+0

謝謝你 – Beez

0

所以,你想從LISTAGG輸出的累計值的MINMAX日期。

由於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'和'在新min_dt和max_dt列MAX'。 –

+0

我沒有得到你所說的話「然後再來一步,只需在新的min_dt和max_dt列上應用MIN和MAX。」 – Beez