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