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));