每行的最大日期

MAX Date for each row

我在编写可以为我提供多个结果的最新日期的语法时遇到了一些困难。一点背景知识,我从 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

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

您必须先获取聚合,然后使用结果连接回您的源数据以获得您需要的剩余数据(在本例中为 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
;