2015-05-29 117 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