我有一個情況,我在一個表中存盤每個成員的可用性。 這是個有4列的簡單表格。
CREATE TABLE availablities (
availablity_id serial PRIMARY KEY,
member_id serial,
availablity_status_id serial,
start_date timestamp
每個成員在表中可以有多個記錄,為了獲得當前的狀態 我為每個成員獲取具有小于now()的最新start_date的記錄。
我首先嘗試使用天真的Max()和Group by查詢
select
status_code, max(start_date) start_date,availablities.member_id
來自的
資格
加入。
availablity_status on availablity_status.availablity_status_id = availablities.availablity_status_id
where
start_date <= now()
group by
status_code,availablities.member_id。
但是這對每個用戶來說會回傳多條記錄,因為我按用戶和狀態獲得最新的記錄。
我最終想出了一個查詢,它給了我預期的結果。
select status_code, start_date,a2.member_id from availablities a2
join availablity_status on availablity_status.availablity_status_id = a2.availablity_status_id
where a2.availablity_id in(
select
max(availablity_id)
from availablities a
where
a.member_id = a2.member_id and
start_date in(
select
max(start_date) start_date
from availablities
哪里?
start_date <= now()
and a.member_id = availablities.member_id
)
);
但是這個查詢需要花費60倍的時間來執行,感覺不對。 我很確定一定有一個更好的解決方案,但我無法得到它。
什么是正確的解決方案?
獲得預期結果的正確方法是什么?
我創建了一個 DB-fiddle,以使其更容易看到。查詢 1 是不正確的,當我們有幾個更多的資料時,查詢 2 會慢得多。
https://www.db-fiddle.com/f/iWgvuj8kcms9F5CKuoKsny/2
uj5u.com熱心網友回復:
看起來你需要在這里使用一個簡單的row_number視窗函式:
with a as (
select *, Row_Number() over(partition by member_id order by start_date desc, availablity_id desc) rn
from availablities
where start_date</span>now()
)
select s.status_code, a.start_date, a.member_id
from a join availablity_status s on s.availablity_status_id=a.availablity_status_id
where rn=1
注意你的資料沒有足夠的選擇性,那么對于member_id 3,它到底有沒有?當有兩個相同的日期時,最近的日期是什么?
我增加了一個平局的選項。
我添加了一個平局,也是按availability_id排序,以得到你預期的結果
實際上是availablity_id--你在這里似乎有一個常見的錯字!
請看您的更新的Fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326835.html
標籤:
上一篇:在Python中計算排除相同元素的對之間的函式平均值的最有效方法?
下一篇:SQL回傳某列數值發生變化的記錄
