假设我有一个名为[ProductPriceHistory]的表,如下所示:
HistoryID..ProductCode..EffectDate.... Price.... IsActive...ProductName 1----------11-----------1 Jan 09-------100-------true-------AAA 2----------11-----------1 Feb 09-------150-------true-------AAA 3----------11-----------1 Mar 09-------200-------false------AAA 4----------22-----------1 Jan 09-------150-------true-------BBB 5----------22-----------1 Feb 09-------200-------true-------BBB 6----------22-----------1 Mr 09--------250-------true-------AAA
如何在最近的日期找到所有有效产品的最终状态?
也就是说,我的查询会找到行:
6----------22-----------1 Mr 09--------250-------true-------AAA
答案 0 :(得分:2)
select * from ProductPriceHistory p1
where EffectDate =
(select max(EffectDate) from ProductPriceHistory p2
where p1.ProductCode = p2.ProductCode and p2.EffectDate<=getdate())
答案 1 :(得分:1)
你还没有完全指明 - 也许@tekBlues的查询是你想要的,或者可能:
SELECT * FROM ProductPriceHistory t1
WHERE t1.EffectDate =
(SELECT MAX(t2.EffectDate)
FROM ProductPriceHistory t2
WHERE t2.IsActive=true)
AND t1.IsActive=true
答案 2 :(得分:1)
获取给定产品代码的值:
DECLARE @ProcuctCode int
SET @ProductCode=11
SELECT
h.*
FROM ProductPriceHistory h
INNER JOIN (SELECT
ProductCode
,MAX(EffectDate) AS MaxEffectDate
FROM ProductPriceHistory
WHERE ProductCode=@ProductCode
AND IsActive='true'
GROUP BY ProductCode
) dt ON h.ProductCode=dt.ProductCode AND h.EffectDate=dt.MaxEffectDate
WHERE h.ProductCode =@ProductCode
查找所有产品使用:
SELECT
h.*
FROM ProductPriceHistory h
INNER JOIN (SELECT
ProductCode
,MAX(EffectDate) AS MaxEffectDate
FROM ProductPriceHistory
WHERE IsActive='true'
GROUP BY ProductCode
) dt ON h.ProductCode=dt.ProductCode AND h.EffectDate=dt.MaxEffectDate
ORDER BY h.ProductCode
答案 3 :(得分:0)
假设ProductCode和EffectDate唯一标识一行,您可以执行以下操作:
SELECT *
FROM productpricehistory
, (SELECT productcode
, MAX(effectdate) effectdate
FROM productpricehistory
GROUP BY productcode) maxhistory
WHERE productpricehistory.productcode = maxhistory.productcode
AND productpricehistory.effectdate = maxhistory.effectdate
AND IsActive = TRUE;
如果ProductCode和EffectDate没有唯一标识一行,你可能想要使用HistoryId而不是EffectDate,如果我们可以假设HistoryId是唯一的,并且增加的HistoryId也意味着增加的EffectDate。
编辑:我意识到我的处理活动与你不同 - 我假设IsActive仅适用于特定的EffectDate,但我看到你通过将其“IsActive”设置为false来停用整个产品。我相应地更新了,假设您可以通过创建一个IsActive = true的新行来激活产品。