Sql 每行的最大日期

Sql 每行的最大日期,sql,db2,greatest-n-per-group,ibm-midrange,Sql,Db2,Greatest N Per Group,Ibm Midrange,我在编写语法时遇到了一些困难,它将为我提供几个结果的最新日期。一点背景知识,我从IBMAS400中提取实时数据,我没有SQL表,我通过ODBC连接到表,使用QTODBC创建查询,然后将它们导出到PowerBI。 据我所知,从AS400表中提取数据与SQL查询略有不同,但差别不大 这是数据的外观,该序列号在不同日期的多个事务 我可以通过省略用户来获取最近的日期 select HVSERN, MAX(HVTDAT) as Date From SERH Where H

我在编写语法时遇到了一些困难,它将为我提供几个结果的最新日期。一点背景知识,我从IBMAS400中提取实时数据,我没有SQL表,我通过ODBC连接到表,使用QTODBC创建查询,然后将它们导出到PowerBI。 据我所知,从AS400表中提取数据与SQL查询略有不同,但差别不大

这是数据的外观,该序列号在不同日期的多个事务

我可以通过省略用户来获取最近的日期

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\u 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

我建议
订购和
先取

SELECT serh.*
FROM SERH    
WHERE HVSERN = '519488536' 
ORDER BY HVTDAT DESC
FETCH FIRST 1 ROW ONLY;
如果您希望对所有
HVSERN
值都使用此方法,那么
ROW\u 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
;

第一个很有魅力,第二个按用户对结果进行分组,但显示了3个结果,我想是因为有三个用户接触了序列。如果我想删除序列并将该查询应用于整个表,我会删除什么?那么第二个查询只会根据您的数据工作,但是如果您想添加其他列,第一个查询是理想的查询。从您的第一个答案来看,我是否能够与其他表一起运行该查询?像左键联接价格表?是的,你可以做左键联接,它不关心其他表。