[英]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.