有沒有辦法改進以下查詢?我需要以下查詢的優化版本。我Date_Table多次加入的原因是這些ID and date_value列不是按升序排列的。IE
ID = 1, date_value = '2022-09-07'; ID = 2, date_value = '2022-02-02'; ID = 3, date_value = '2022-11-12';
樣本資料:
表中的最大日期Agreements是根據Date_Table.date_value列計算的。查詢將只回傳一行。在這種情況下,以綠色突出顯示的行將是結果。
太感謝了!
SELECT * FROM Agreement
WHERE
dim_date_id = (
SELECT
Date_Table.ID
FROM (
SELECT
MAX(Date_Table.date_value) AS date_value
FROM Agreement
INNER JOIN Date_Table
ON Agreement.DIM_DATE_ID = Date_Table.ID
) AS last_day
INNER JOIN Date_Table
ON last_day.date_value = Date_Table.date_value
);
uj5u.com熱心網友回復:
如果協議是一個大表,您應該首先找到所有不同的 date_id,然后將其加入 Date_Table。還可以使用 rank() 視窗函式來查找最近記錄的 id:
Select Agreement.* From Agreement Inner Join (
Select ID From (
Select Date_Table.ID
,rank() Over (Order by Date_Table.date_value desc) as recent
From Date_Table Inner Join (
Select Distinct Dim_Date_ID as ID From Agreement
) A On A.ID=Date_Table.ID
) where recent=1
) X On Agreement.DIM_DATE_ID = X.ID
乍一看,這看起來和您的原始查詢一樣復雜。但它很快將協議結果減少到只有日期 id 的串列,特別是如果該欄位被索引,它是一個快速查詢。然后使用 rank() 函式對 Date_Table 進行內連接以找到最佳(最新)Date_Value。整件事被過濾,只保留一條記錄,最近的,那個 date_id 用于過濾協議。
同樣,我建議您索引 Agreement.Dim_Date_ID 以使此查詢執行良好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/516138.html
