[英]SQL - Join Grouped By Max Date (Including ID)
假設下表...
ValueHistory ID整數(身份),HistoryDate日期時間,Contract_ID整數,Item_ID整數,Value smallmoney
我想獲取最新值(基於HistoryDate)以及與之關聯的ID(按Contract_ID和Item_ID分組)。
我目前有這個,它將帶出最新的Date / Contract_ID / Item_ID,但是顯然我不能按ID分組,因為它會帶回太多行。 我考慮使用最大ID,但不幸的是,由於插入日期的方式不同,有可能使用較低的ID,而使用的是最近的日期。
SELECT
MAX([HistoryDate]) as 'Max_HistoryDate',
[Contract_ID],
[Item_ID]
FROM [ValueHistory]
WHERE
[HistoryDate] < @EndDate
GROUP BY [Item_ID], [Contract_ID]
我認為可以通過其他子查詢來執行此操作,但目前它使我無法幸免。
SQL小提琴在這里: http ://sqlfiddle.com/#!18/655e9/1
按照建議的答案,效果很好。
select
ID
, HistoryDate
, Contract_ID
, Item_ID
from
(
SELECT
HistoryDate
, ID
, Contract_ID
, Item_ID
, RowNum = ROW_NUMBER() over(partition by Contract_ID, Item_ID order by HistoryDate DESC)
FROM ValueHistory
WHERE HistoryDate < @EndDate
) x
where x.RowNum = 1
很確定您想要這樣的東西。
select HistoryDate
, Contract_ID
, Item_ID
from
(
SELECT
HistoryDate
, Contract_ID
, Item_ID
, RowNum = ROW_NUMBER() over(partition by Contract_ID order by HistoryDate DESC)
FROM ValueHistory
WHERE HistoryDate < @EndDate
) x
where x.RowNum = 1
我將結果返回到原始表中,並與“項目ID”,“合同ID”和“匹配最大歷史日期”的“歷史日期”配對。
select *
from
(select *
from [ValueHistory]
) a
join
(
SELECT
MAX([HistoryDate]) as [Max_HistoryDate],
[Contract_ID] as [bContract_ID],
[Item_ID] as [bItem_ID]
FROM [ValueHistory]
WHERE
[HistoryDate] < @EndDate
GROUP BY [Item_ID], [Contract_ID]) b
on a.[item_id]=b.[bitem_id] and
a.[contract_id]=b.[bcontract_id] and
a.[HistoryDate]=b.[Max_HistoryDate]
使用cte可能會有所幫助:
;with cte (Max_HistoryDate,Contract_ID,Item_ID) as
(
SELECT
MAX([HistoryDate]) as 'Max_HistoryDate',
[Contract_ID],
[Item_ID]
FROM [ValueHistory]
WHERE [HistoryDate] < '2018-02-01'
GROUP BY [Item_ID], [Contract_ID]
)
Select Value, ih.Contract_ID, ih.Item_ID
From ValueHistory ih
inner join cte on ih.Contract_ID = cte.Contract_ID
and ih.Item_ID = cte.Item_ID
where ih.HistoryDate = cte.Max_HistoryDate
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.