java - 如果 select 语句包含 DATE 类型的列,则聚合 SQL 查询不起作用

标签 java sql oracle

我想选择版本列上具有最新值的单个记录。但是,如果我包含日期类型的 retrn_period 列,我的查询将返回多条记录。

SELECT rdo_code, batch_no, reference_no, dln, retrn_seq_num, ftype_code, tin, 
    branch_code, tax_type, retrn_period, Max(version)
FROM   rfp_returns_ref 
WHERE  tin = '000079108' 
AND    ftype_code = '1702EX' 
AND    Upper(status) = Upper('POSTED') 
group by rdo_code, batch_no,reference_no, dln, 
    retrn_seq_num, ftype_code, tin, branch_code, tax_type, retrn_period;

最佳答案

If I include the retrn_period column ... my query returns multiple records.

通过包含 retrn_period 列,您将更改查询的非聚合投影,因此现在您可以获得结果集中每个不同日期的最大版本。

您想显示最新版本的日期吗?假设您的 retrn_periodversion 一起增加,这将起作用:

SELECT rdo_code, batch_no, reference_no, dln, retrn_seq_num, ftype_code, tin, 
    branch_code, tax_type
       , max(retrn_period) as retrn_period
       , max(version) as version
FROM   rfp_returns_ref 
WHERE  tin = '000079108' 
AND    ftype_code = '1702EX' 
AND    Upper(status) = Upper('POSTED') 
group by rdo_code, batch_no,reference_no, dln, 
    retrn_seq_num, ftype_code, tin, branch_code, tax_type;

对于无法聚合的内容(例如name),一个更通用的解决方案是使用具有分析函数的子查询...

SELECT sq.rdo_code, sq.batch_no, sq.reference_no, sq.dln, sq.retrn_seq_num, sq.ftype_code, sq.tin, 
    sq.branch_code, sq.tax_type
       , sq.retrn_period
       , sq.name
       , sq.version
from (    
    SELECT rdo_code, batch_no, reference_no, dln, retrn_seq_num, ftype_code, tin, 
            branch_code, tax_type
               , retrn_period
               , version
               , name
               , rank() over (partition by rdo_code, batch_no,reference_no, dln, 
            retrn_seq_num, ftype_code, tin, branch_code, tax_type
                    order by version desc ) as rn
        FROM   rfp_returns_ref 
        WHERE  tin = '000079108' 
        AND    ftype_code = '1702EX' 
        AND    Upper(status) = Upper('POSTED') 
        ) sq
where sq.rn = 1 ;

如果您使用的是 Oracle 12c,则可以使用获取限制语法,这要简单得多:

SELECT rdo_code, batch_no, reference_no, dln, retrn_seq_num, ftype_code, tin, 
    branch_code, tax_type
       , retrn_period
       , version
FROM   rfp_returns_ref 
WHERE  tin = '000079108' 
AND    ftype_code = '1702EX' 
AND   order by version desc 
fetch first 1 row only;

关于java - 如果 select 语句包含 DATE 类型的列,则聚合 SQL 查询不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54978046/

相关文章:

MySql 计算相同的值

mysql - 购买超过 250 美元的客户

sql - 在 Oracle 中使用单个语句在表之间移动行

java - 如何在 Android Studio ListView 中显示项目的文本

java - java中的XML解析

java - Swing : Exit application actionListener

sql - 每个类型的表数据检索

sql - 在 Oracle 中使用 Regexp_substr 选择字符串,直到\n字符长度内最后一次出现空格

oracle - 使用Oracle OLE DB提供程序时如何解决SQL查询参数映射问题?

java - 使用 GSON 将 java.io.File 解析为 JSON