我有一張桌子(所有代碼都在fiddle 上)。
id nom bal bal_dt val_dt
1 Bill 75.00 2019-11-01 2020-03-31
1 Bill 100.00 2020-04-01 2020-07-31
1 Bill 500.00 2020-08-01 2021-11-11 -- record goes over New Year 2021
2 Ben 5.00 2019-11-01 2020-03-31
2 Ben 10.00 2020-04-01 2020-07-31
2 Ben 100.00 2020-08-01 2021-11-11 -- record goes over New Year 2021
6 rows
主鍵是 (id, bal_dt) - 每天只有一筆存款。
我想獲得2021 年新年之前的最后一條記錄(或 <= 2021-01-01 00:00:00)。
我從這里嘗試代碼如下。
select a2.id, a2.nom, a2.val_dt,
(select count(*) from account a1 where a1.id < a2.id) AS rn
from account a2
where a2.val_dt <= '2021-01-01 00:00:00'
order by val_dt desc;
但結果并不好。
id nom val_dt rn
1 Bill 2020-07-31 0
2 Ben 2020-07-31 3
1 Bill 2020-03-31 0
2 Ben 2020-03-31 3
我想要類似的東西
id nom rn val_dt bal
1 Bill 1 2020-08-01 500.00
2 Ben 1 2020-08-01 100.00
所以我為比爾和本選擇唱片。請問有什么幫助嗎?
注意 - 我不需要 @variables 并且不假設只有 3 個記錄或只有 2 個帳戶,而且日期不相同,而不僅僅是最后一個日期!
uj5u.com熱心網友回復:
您可以使用NOT EXISTS和 相關子查詢來檢查所需時間段內是否缺少較新的時間戳。
SELECT a1.id,
a1.nom,
a1.val_dt
FROM account a1
WHERE a1.val_dt < '2021-01-01 00:00:00'
AND NOT EXISTS (SELECT *
FROM account a2
WHERE a2.val_dt < '2021-01-01 00:00:00'
AND a2.val_dt > a1.val_dt
AND a2.id = a1.id);
請注意, 2021-01-01 00:00:00 已經是 2021 年,因此運營商實際上需要<不是<=。
uj5u.com熱心網友回復:
解決了(見小提琴)!
select
tab.id, tab.md, a2.bal
from account a2
join
(
select
a1.id, max(a1.bal_dt) AS md
from account a1
where a1.bal_dt <= '2021-01-01 00:00:00'
group by a1.id
) as tab
on a2.id = tab.id and a2.bal_dt = tab.md;
和。
id md bal
1 2020-08-01 500.00
2 2020-08-01 100.00
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/355974.html
上一篇:檢查嵌套物件中是否存在布林值
下一篇:我不能在查詢中宣告
