Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果select语句包含日期类型的列,则聚合sql查询不起作用_Java_Sql_Oracle - Fatal编程技术网

Java 如果select语句包含日期类型的列,则聚合sql查询不起作用

Java 如果select语句包含日期类型的列,则聚合sql查询不起作用,java,sql,oracle,Java,Sql,Oracle,我想在“版本”列中选择一条具有最新值的记录。但是,如果我包括日期类型的retrn\u 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

我想在“版本”列中选择一条具有最新值的记录。但是,如果我包括日期类型的
retrn\u 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;
如果我包括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;
通过包含
retrn\u period
列,您正在更改查询的非聚合投影,因此现在您可以获得结果集中每个不同日期的最大版本

是否要显示最新版本的日期?假设您的
retrn\u期间
随着
版本
的增加而增加,这将起作用:

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,则可以使用fetch limiting语法,该语法要简单得多:

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;

如果你想选择一个版本号最高的单声道唱片,那么我认为你根本不需要对任何东西进行分组

按版本号对行进行排序并抓取前1行即可:

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 UPPER(status) = UPPER('POSTED')
ORDER BY version DESC
FETCH FIRST 1 ROWS ONLY;

此查询假设您正在运行Oracle 12c。

retrn\u period列是数据类型还是带有时间戳的日期数据类型?@saravanatn它是数据库中日期的数据类型table@LogronJ是否可能
RETRN\u PERIOD
包含导致多行的时间部分,但SQL客户端仅显示日期部分,从而使它看起来像复制品?如果使用
TRUNC(RETRN\u PERIOD)
,它会删除小时、分钟和秒,那么多条记录会消失吗?
You can also use rownum=1

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 UPPER(status) = UPPER('POSTED')
AND rownum=1
ORDER BY version DESC;
---------------------------------------------------------------------------------------
or subquery like

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 a
WHERE
    tin = '000079108' 
    AND ftype_code = '1702EX' 
    AND UPPER(status) = UPPER('POSTED')
AND a.version = (SELECT Max(b.version) 
                   FROM rfp_returns_ref b 
                  WHERE b.tin = a.tin
                    AND b.ftype_code = a.ftype_code
                    AND b.UPPER(status) = UPPER(a.status));