DB2:SQL将返回该组中两个最新记录中具有特定列值的组中的所有行

问题描述 投票:-1回答:2

我有一个DB2表,其中的列(A)之一为PQR或XYZ。

我需要基于col C日期的最新两个记录的值A = PQR的输出。

样品表

A   B     C
--- ----- ----------
PQR Mark  08/08/2019
PQR Mark  08/01/2019
XYZ Mark  07/01/2019
PQR Joe   10/11/2019
XYZ Joe   10/01/2019
PQR Craig 06/06/2019
PQR Craig 06/20/2019

在此示例表中,我的输出将是Mark和Craig记录

db2 db2-luw
2个回答
1
投票

自11.1起

您可以使用nth_value OLAP功能。请参阅OLAP specification

SELECT A, B, C
FROM
(
SELECT 
  A, B, C
, NTH_VALUE (A, 1) OVER (PARTITION BY B ORDER BY C DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) C1
, NTH_VALUE (A, 2) OVER (PARTITION BY B ORDER BY C DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) C2
FROM TAB
)
WHERE C1 = 'PQR' AND C2 = 'PQR'

dbfiddle链接。

较旧的版本

SELECT T.*
FROM TAB T
JOIN 
(
SELECT B
FROM
(
SELECT 
  A, B
, ROWNUMBER() OVER (PARTITION BY B ORDER BY C DESC) RN
FROM TAB
)
WHERE RN IN (1, 2)
GROUP BY B
HAVING MIN(A) = MAX(A) AND COUNT(1) = 2 AND MIN(A) = 'PQR'
) G ON G.B = T.B;

0
投票

一个简单的解决方案可能是

SELECT A,B,C 
  FROM tab
 WHERE A = 'PQR'
 ORDER BY C DESC FETCH FIRST 2 ROWS only
© www.soinside.com 2019 - 2024. All rights reserved.