每行的最大日期

问题描述 投票:1回答:3

我在编写语法时遇到了一些困难,该语法将为我提供多个结果的最新日期。有点背景,我从IBM AS400中获取实时数据,我没有SQL表,我通过ODBC连接到表,使用QTODBC创建查询,然后将它们导出到Power Bi。据我所知,从AS400表中提取数据与SQL查询有点不同,就没那么大。

这是数据的样子,该序列号在不同日期的多次交易。

enter image description here

省略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
sql db2 greatest-n-per-group ibm-midrange
3个回答
1
投票

使用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

0
投票

我建议ORDER BYFETCH 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
                 ); 

0
投票

您必须先获取汇总,然后使用结果将其联接回您的源数据,以获取所需的其余数据(在这种情况下为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
;
© www.soinside.com 2019 - 2024. All rights reserved.