【发布时间】:2019-12-26 15:05:50
【问题描述】:
我有一张简化后的表格,如下所示:
WITH TBL (ITEM, COST, DAY) AS (
SELECT 'A', 6, TO_DATE('2019-08-13', 'YYYY-MM-DD') FROM DUAL
UNION ALL
SELECT 'B', 4, TO_DATE('2019-08-21', 'YYYY-MM-DD') FROM DUAL
UNION ALL
SELECT 'B', 4, TO_DATE('2019-08-18', 'YYYY-MM-DD') FROM DUAL
UNION ALL
SELECT 'A', 2, TO_DATE('2019-08-21', 'YYYY-MM-DD') FROM DUAL
UNION ALL
SELECT 'B', 5, TO_DATE('2019-08-16', 'YYYY-MM-DD') FROM DUAL
UNION ALL
SELECT 'C', 2, TO_DATE('2019-08-15', 'YYYY-MM-DD') FROM DUAL
) SELECT ITEM, COST, DAY FROM TBL;
ITEM | COST | DAY
-----+------+--------------------
A | 6 | 2019-08-13 00:00:00
B | 4 | 2019-08-21 00:00:00
B | 4 | 2019-08-18 00:00:00
A | 2 | 2019-08-21 00:00:00
B | 5 | 2019-08-16 00:00:00
C | 2 | 2019-08-15 00:00:00
我要查询每件商品的最新费用。
ITEM | COST | DAY
-----+------+--------------------
B | 4 | 2019-08-21 00:00:00
A | 2 | 2019-08-21 00:00:00
C | 2 | 2019-08-15 00:00:00
我这样做的方法是让 CTE 获取每个项目的最新日期,然后 加入费用。
WITH CTE (ITEM, DAY) AS (
SELECT ITEM, MAX(DAY)
FROM TBL
GROUP BY ITEM
)
SELECT CTE.ITEM, TBL.COST, CTE.DAY
FROM CTE
JOIN TBL ON TBL.ITEM = CTE.ITEM AND TBL.DAY = CTE.DAY;
我的问题是,是否有一种更简单的方法可以在没有 CTE 的情况下在一个查询中完成。
我尝试将 MAX 与 GROUP BY 结合使用,但没有找到任何方法使其发挥作用。
SELECT ITEM, COST, MAX(DAY)
FROM TBL
GROUP BY ITEM, COST;
当我真正需要的是将其与 MAX 天相应地分组时,它只会将具有相同项目和成本的记录分组。
ITEM | COST | DAY
-----+------+--------------------
A | 6 | 2019-08-13 00:00:00
B | 4 | 2019-08-21 00:00:00
A | 2 | 2019-08-21 00:00:00
B | 5 | 2019-08-16 00:00:00
C | 2 | 2019-08-15 00:00:00
【问题讨论】:
标签: sql oracle oracle11g group-by maxdate