我在编写语法时遇到了一些困难,该语法将为我提供多个结果的最新日期。有点背景,我从IBM AS400中获取实时数据,我没有SQL表,我通过ODBC连接到表,使用QTODBC创建查询,然后将它们导出到Power Bi。据我所知,从AS400表中提取数据与SQL查询有点不同,就没那么大。
这是数据的样子,该序列号在不同日期的多次交易。
省略HVUSER,我可以获得最新的日期。
select
HVSERN,
MAX(HVTDAT) as Date
From SERH
Where HVSERN = '519488536' (there are thousands of other serials, tens of thousands of transactions)
Group by HVSERN
HVSERN HVTDAT
519488536 11/26/2019
[当我添加上次触摸序列的“ HVUSER”列时,我不再能够保留上一个事务。谁能帮我解决这个问题?有人告诉我我需要嵌套查询,是否可以使用子查询来清理旧日期?我正在寻找的是。
HVSERN HVTDAT HVUSER
519488536 11/26/2019 VG55
使用row_number()
,db2支持此。
select * from (
select HVSERN, row_number() over (partition by HVSERN order by HVTDAT desc) as rn, HVUSER
from SERH
Where HVSERN = '519488536') t where t.rn = 1
或
select
HVSERN, HVUSER,
MAX(HVTDAT) as Date
From SERH
Where HVSERN = '519488536'
Group by HVSERN, HVUSER
我建议ORDER BY
和FETCH FIRST
:
SELECT serh.*
FROM SERH
WHERE HVSERN = '519488536'
ORDER BY HVTDAT DESC
FETCH FIRST 1 ROW ONLY;
如果要为所有HVSERN
值使用此值,则ROW_NUMBER()
是一种合理的方法。在许多数据库中,相关子查询更快:
SELECT s.*
FROM SERH s
WHERE s.HVTDAT = (SELECT MAX(h2.HVDAT)
FROM SERH s2
WHERE s2.HVSERN = s.HVSERN
);
您必须先获取汇总,然后使用结果将其联接回您的源数据,以获取所需的其余数据(在这种情况下为HVUSER)。试试这个,它应该可以解决问题。
select
T1.HVSERN,
T1.dt,
T2.HVUSER
from (
select
HVSERN,
MAX(HVTDAT) as dt
from
SERH
group by
HVSERN) T1
inner join SERH T2 on T1.HVSERN = T2.HVSERN and T1.dt = T2.HVTDAT
;