简体   繁体   English

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

[英]How to derive max date on LISTAGG Oracle 12c

Oracle 12c installation. Oracle 12c安装。 I am having trouble organizing Oracle listagg() to show the count of cars column of my query to display the results of only the max(inventory_date) data per location. 我在组织Oracle listagg()以显示查询的汽车计数列时仅显示每个位置的max(inventory_date)数据的结果时遇到麻烦。

I was thinking to create a view to aggregate the results: 我正在考虑创建一个视图以汇总结果:

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;

Create the table and insert test rows, Installed on Oracle 12c on Windows 创建表并插入测试行,已在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'));

Results should be the inventory list of the max(inventory_date) by location: 结果应该是按位置列出的最大(inventory_date)库存清单:

MAX(INVENTORY_DATE) LOCATION    INVENTORY_LIST
-------------------- ----------- -------------------------
2019-08-30          leamington  10 Trans AM, 7 Rovers
2019-09-07          coventry    8 Rovers, 9 Jaguars  

I am stuck on a simple problem, please advise how I can get the list created for the max date data only by location. 我遇到了一个简单的问题,请告诉我如何仅按位置获取为最大日期数据创建的列表。

Thank you in advance, Gilly 预先谢谢吉莉

You could proceed in two steps : 您可以分两步进行:

  • first, use RANK() in a subquery to identify the records that correspond to the latest inventory date at each location 首先,在子查询中使用RANK()来标识与每个位置的最新库存日期相对应的记录

  • then, use aggregation in the outer query and generate the inventory list of each location using LISTAGG() 然后,在外部查询中使用汇总,并使用LISTAGG()生成每个位置的库存清单

Query: 查询:

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;

Demo on DB Fiddle DB Fiddle上的演示

Data: 数据:

COUNT_CARS | EQUIPMENT_TYPE | LOCATION   | INVENTORY_DATE
---------: | :------------- | :--------- | :-------------
         8 | Rovers         | coventry   | 07-SEP-19     
         9 | Jaguars        | coventry   | 07-SEP-19     
         7 | Rovers         | leamington | 30-AUG-19     
        10 | Trans Am       | leamington | 30-AUG-19     
         8 | Rovers         | coventry   | 07-JAN-19     
         4 | Rovers         | leamington | 08-JAN-19

Results: 结果:

MAX_INVENTORY_DATE | LOCATION   | INVENTORY_LIST       
:----------------- | :--------- | :--------------------
30-AUG-19          | leamington | 7 Rovers, 10 Trans Am
07-SEP-19          | coventry   | 9 Jaguars, 8 Rovers

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM