Select 仅最近一行

Select Only the Most Recent Row

我正在使用查询来提取项目的估价成本。它运作良好,除了有时它 returns 多行用于估值。

如何修改我的查询以仅获取最新记录以避免多行?

查询

SELECT
    to_char( BVALUATN.G3_CALC_VALUE, '9,999,999,999,999' ) AS "Valuation",
    TO_CHAR( G6ACTION.G6_ACT_DD, 'mm/dd/yyyy') AS "Final Date"

FROM PERMIT

LEFT OUTER JOIN G6ACTION G6ACTION
    ON  (PERMIT.B1_PER_ID1 = G6ACTION.B1_PER_ID1)
    AND (PERMIT.B1_PER_ID3 = G6ACTION.B1_PER_ID3)

LEFT OUTER JOIN BVALUATN BVALUATN ON (PERMIT.B1_PER_ID1 = BVALUATN.B1_PER_ID1 AND PERMIT.B1_PER_ID3 = BVALUATN.B1_PER_ID3)

WHERE TRUNC (G6ACTION.G6_ACT_DD) > TO_DATE ('01/01/2020', 'mm/dd/yyyy')
AND TRUNC (G6ACTION.G6_ACT_DD) < TO_DATE ('04/06/2022', 'mm/dd/yyyy')

ORDER BY "Valuation" DESC;

输出

期望的输出

我有兴趣查看各种建议,以了解什么最适合不同的用例,例如,使用聚合函数、子查询等。感谢您的帮助。

我正在使用 Oracle 数据库版本 12.1.0.2.0。

您可以根据估值和select最大日期进行分组,如下所示

SELECT
    to_char( BVALUATN.G3_CALC_VALUE, '9,999,999,999,999' ) AS "Valuation",
    MAX(TO_CHAR( G6ACTION.G6_ACT_DD, 'mm/dd/yyyy')) AS "Final Date"

FROM B1PERMIT

LEFT OUTER JOIN G6ACTION G6ACTION
    ON  (PERMIT.B1_PER_ID1 = G6ACTION.B1_PER_ID1)
    AND (PERMIT.B1_PER_ID3 = G6ACTION.B1_PER_ID3)

LEFT OUTER JOIN BVALUATN BVALUATN ON (PERMIT.B1_PER_ID1 = BVALUATN.B1_PER_ID1 AND PERMIT.B1_PER_ID3 = BVALUATN.B1_PER_ID3)

WHERE TRUNC (G6ACTION.G6_ACT_DD) > TO_DATE ('01/01/2020', 'mm/dd/yyyy')
AND TRUNC (G6ACTION.G6_ACT_DD) < TO_DATE ('04/06/2022', 'mm/dd/yyyy')
GROUP BY to_char( BVALUATN.G3_CALC_VALUE, '9,999,999,999,999' )
ORDER BY "Valuation" DESC

由于您使用的是数据库版本 12c+,因此您可以在 ORDER BY 之后使用 FETCH 子句来升序 "Valuation",例如

ORDER BY "Valuation", "Final Date" DESC
FETCH FIRST 1 ROW ONLY

如果您需要两个相等的值,则将 ONLY 替换为 WITH TIES 并删除部分 , "Final Date" DESC