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
我正在使用查询来提取项目的估价成本。它运作良好,除了有时它 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