Sql 如何在Listag Oracle 12c上导出最大日期

Sql 如何在Listag Oracle 12c上导出最大日期,sql,oracle,date,max,listagg,Sql,Oracle,Date,Max,Listagg,Oracle 12c安装。我在组织OracleListag()以显示查询中的“车辆计数”列以仅显示每个位置的max(库存日期)数据时遇到问题 我想创建一个视图来汇总结果: create or replace view car_inventory_vw as select max(a.inventory_date) as max_date, a.location,LISTAGG(a.COUNT_CARS||' '||a.EQUIPMENT_TYPE,',') within GROUP (ORDE

Oracle 12c安装。我在组织Oracle
Listag()
以显示查询中的“车辆计数”列以仅显示每个位置的max(库存日期)数据时遇到问题

我想创建一个视图来汇总结果:

create or replace view car_inventory_vw as 
select max(a.inventory_date) as max_date,
a.location,LISTAGG(a.COUNT_CARS||' '||a.EQUIPMENT_TYPE,',')
within GROUP (ORDER BY a.equipment_type) as equipment_list 
from car_equipment a 
group by a.location;
创建表并插入测试行,安装在Windows上的Oracle 12c上

CREATE TABLE "CAR_EQUIPMENT" 
   (    "COUNT_CARS" NUMBER(10,0), 
"EQUIPMENT_TYPE" VARCHAR2(100 BYTE), 
"LOCATION" VARCHAR2(500 BYTE), 
"INVENTORY_DATE" DATE) 
SEGMENT CREATION IMMEDIATE 
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
NOCOMPRESS LOGGING
   STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
   PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
   BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
   TABLESPACE "USERS" ;

INSERT INTO "CAR_EQUIPMENT" (COUNT_CARS, EQUIPMENT_TYPE, LOCATION,     INVENTORY_DATE) VALUES ('8', 'Rovers', 'coventry', TO_DATE('2019-09-07 00:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO "CAR_EQUIPMENT" (COUNT_CARS, EQUIPMENT_TYPE, LOCATION, INVENTORY_DATE) VALUES ('9', 'Jaguars', 'coventry', TO_DATE('2019-09-07 00:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO "CAR_EQUIPMENT" (COUNT_CARS, EQUIPMENT_TYPE, LOCATION, INVENTORY_DATE) VALUES ('7', 'Rovers', 'leamington', TO_DATE('2019-08-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO "CAR_EQUIPMENT" (COUNT_CARS, EQUIPMENT_TYPE, LOCATION, INVENTORY_DATE) VALUES ('10','Trans Am', 'leamington', TO_DATE('2019-08-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO "CAR_EQUIPMENT" (COUNT_CARS, EQUIPMENT_TYPE, LOCATION, INVENTORY_DATE) VALUES ('8', 'Rovers', 'coventry', TO_DATE('2019-01-07 00:00:00', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO "CAR_EQUIPMENT" (COUNT_CARS, EQUIPMENT_TYPE, LOCATION, INVENTORY_DATE) VALUES ('4', 'Rovers', 'leamington', TO_DATE('2019-01-08 00:00:00', 'YYYY-MM-DD HH24:MI:SS'));
结果应为按位置列出的最大(库存日期)库存清单:

MAX(INVENTORY_DATE) LOCATION    INVENTORY_LIST
-------------------- ----------- -------------------------
2019-08-30          leamington  10 Trans AM, 7 Rovers
2019-09-07          coventry    8 Rovers, 9 Jaguars  
我遇到了一个简单的问题,请告知我如何才能获得仅按位置创建的最长日期数据列表

提前谢谢大家,,
Gilly

您可以分两步进行:

  • 首先,在子查询中使用
    RANK()

  • 然后,在外部查询中使用聚合,并使用
    listag()

查询:

SELECT 
    inventory_date max_inventory_date,
    location,
    LISTAGG(count_cars || ' ' || equipment_type, ', ') 
        WITHIN GROUP (ORDER BY equipment_type) inventory_list
FROM (
    SELECT c.*, RANK() OVER(PARTITION BY location ORDER BY inventory_date DESC) rn
    FROM car_equipment c
) x 
WHERE rn = 1
GROUP BY inventory_date, location;

数据:

清点车辆|设备|类型|位置|库存|日期 ---------: | :------------- | :--------- | :------------- 8 |路虎|考文垂| 19年9月7日 9 |美洲虎|考文垂| 19年9月7日 7 |路虎|利明顿| 19年8月30日 19年8月30日上午10时至利明顿 8 |路虎|考文垂| 19年1月7日 4 |路虎|利明顿| 19年1月8日 结果:

MAX_INVENTORY_DATE | LOCATION | INVENTORY_LIST :----------------- | :--------- | :-------------------- 30-AUG-19 | leamington | 7 Rovers, 10 Trans Am 07-SEP-19 | coventry | 9 Jaguars, 8 Rovers 最大库存|日期|位置|库存|清单 :----------------- | :--------- | :-------------------- 19年8月30日|利明顿| 7路虎,上午10时 19年9月7日|考文垂| 9辆美洲虎,8辆路虎
如何显示某个日期而不是最大日期的协同数据? MAX_INVENTORY_DATE | LOCATION | INVENTORY_LIST :----------------- | :--------- | :-------------------- 30-AUG-19 | leamington | 7 Rovers, 10 Trans Am 07-SEP-19 | coventry | 9 Jaguars, 8 Rovers