[英]sql get latest row before date for value
我知道這個問題之前已經回答過,但是也許是因為我在使用DB2或其他東西,但是找不到適合我的解決方案。
我只需要根據重復的KEY列的值選擇每個記錄中的一個(最近的)。
數據如下:
KEY TIME_STAMP STATUS
A 1992-06-30-00.00.00.100000 O
A 1992-02-03-00.00.00.100000 O
A 1991-12-20-00.00.00.100000 O
B 1992-11-19-00.00.00.100000 P
B 1992-11-17-00.00.00.100000 O
B 1992-10-08-00.00.00.100000 O
B 1992-09-24-00.00.00.100000 O
B 1992-09-18-00.00.00.100000 O
C 1984-06-21-00.00.00.100000 O
C 1984-06-05-00.00.00.100000 U
D 1986-04-22-00.00.00.100000 O
D 1986-04-14-00.00.00.100000 O
D 1986-03-16-00.00.00.100000 O
D 1986-03-07-00.00.00.100000 R
E 1985-04-03-00.00.00.100000 O
F 1987-08-14-00.00.00.100000 M
F 1987-07-17-00.00.00.100000 A
我需要它是:
KEY TIME_STAMP STATUS
A 1992-06-30-00.00.00.100000 O
B 1992-11-19-00.00.00.100000 P
C 1984-06-21-00.00.00.100000 O
D 1986-04-22-00.00.00.100000 O
E 1985-04-03-00.00.00.100000 O
F 1987-08-14-00.00.00.100000 M
請注意,僅保留該類型的最新KEY。
所以這是我到目前為止的代碼...實際上是從一個巨大的表中創建頂級數據的:
SELECT KEY, TIME_STAMP, STATUS
FROM HIST
WHERE STATUS IN ('P','O','U','R','M','A')
AND TIME_STAMP < '1993-01-01-00.00.00.100000'
ORDER BY KEY, TIME_STAMP DESC
我不知道該怎么做才能將其進一步縮小。
您可以使用窗口函數:
select *
from (
select KEY,
TIME_STAMP,
STATUS,
row_number() over (partition by KEY order by TIME_STAMP desc) as rn
FROM HIST
WHERE STATUS IN ('P','O','U','R','M','A')
AND TIME_STAMP < '1993-01-01-00.00.00.100000'
)
WHERE rn = 1;
其他方法,但是豪爾赫方法更好
with perimeter as (
select KEY, TIME_STAMP, STATUS
FROM HIST
WHERE STATUS IN ('P','O','U','R','M','A') AND TIME_STAMP < '1993-01-01-00.00.00.100000'
)
select distinct f3.* from perimeter f1
inner join lateral
(
select * from perimeter f2
where f1.key=f2.key
order by f2.TIME_STAMP desc
fetch first rows only
) f3 on 1=1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.