我有以下表格設定:
TableA
Name Loc
Bob US
Bill CA
TableB
Name Phone Updated
Bob 123 121011
Bob 321 121150
我有表 A 和 B ,我想在其中運行一個查詢,將兩者連接起來并從表 B 中獲取最近更新的(更新中的最大值(以較大者為準))電話號碼,并且只回傳一行。我目前正在使用此查詢:
select
A.Name,
A.Loc,
B.Phone
from
TableA A
INNER JOIN TableB B
on A.Name = B.Name
where
A.Name = 'Bob'
我不確定如何僅按更新的列對 B.Phone 進行排序,并僅回傳包含在一個查詢中的行:
Bob, US, 321 (321 because it is the highest value updated)
任何幫助或見解將不勝感激。
uj5u.com熱心網友回復:
你有幾件事正在發生。我編輯了帖子并手動放置了示例資料的文本和 sql 查詢(每個影像的每列后沒有逗號)。
此外,您的資料顯示了一個更新的列,但不清楚它是什么......您提到 123 記錄是最高更新值,但不確定背景關系。看起來不像 DATE 欄位。如果是,那么您應該始終使用正確的資料型別,例如日期時間欄位。從長遠來看,當您需要查詢日期范圍內的內容而不是一些需要重組以獲得預期內容的固定文本格式時,這會更容易。
請編輯您的帖子并將說明放在那里,您可以評論我回來查看。不要試圖在評論中放長篇大論/內容。編輯和更新您的實際帖子。
修改后的查詢。
另一個關于不良樣本資料的澄清。如果只使用一個名字,如果加拿大有 100 個“鮑勃”名字會怎樣。使用自動遞增 ID 鍵將事物聯系在一起,而不僅僅是名稱。如果鮑勃把名字改成羅伯特,那你們都搞砸了。對于來自各自主表的輔助表,請使用與原始表相關聯的 ID。
要獲得您想要的,您將需要一個子查詢來查找相關人員的電話查找輔助表的最近日期是什么。
select
A.Name,
A.Loc,
B.Phone
from
TableA A
INNER JOIN
( select
B1.Name,
max( B1.Updated ) LatestRecord
from TableB B1
where B1.Name = 'Bob'
group by B1.Name ) MostRecentPhone
on A.Name = MostRecentPhone.Name
JOIN TableB B
on MostRecentPhone.Name = B.Name
AND MostRecentPhone.LatestRecord = B.Updated
where
A.Name = 'Bob'
因此,第一個 FROM 和 WHERE 子句滿足您的“Bob”要求。
子查詢的內部連接獲取名稱和最近更新的標記記錄,而不考慮電話 PER 名稱,但也僅過濾“Bob”,但同樣,如果處理 ID 與名稱匹配,則會出現問題。
所以現在我有子查詢回傳 Bob 更新值 = 121150
現在,可以根據匹配的名稱再次加入 FINAL TableB 實體,以及與子查詢匹配的更新值。
uj5u.com熱心網友回復:
您可以使用Rank() 函式來生成您正在尋找的結果:
Select
Name,
Loc,
Phone
From ( Select
A.Name,
A.Loc,
B.Phone,
Rank() Over (Partition By A.Name Order By B.Updated Desc) as Rank
From TableA A Inner Join TableB B On A.Name = B.Name
Where A.Name = 'Bob') As DataTable
Where Rank = 1
uj5u.com熱心網友回復:
也許 CROSS APPLY (SELECT TOP 1...) 方法是最簡單的。
select
A.Name,
A.Loc,
LATEST_B.Phone
from TableA A
cross apply (
select top 1 B.*
from TableB B
where B.Name = A.Name
order by B.Updated desc
) LATEST_B
where
A.Name = 'Bob'
為了獲得大資料的最佳性能,請確保您在 TableB(Name,Updated) 上有一個索引。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/410815.html
標籤:
上一篇:使用作業日日歷計算開始日期
下一篇:插入值后出現截斷錯誤
