繁体   English   中英

SQL - SQL查询问题; 分组并加入

[英]SQL - Problem with SQL Query ; group by and join

假设我有一个名为[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
select * from ProductPriceHistory p1
where EffectDate = 
(select max(EffectDate) from ProductPriceHistory p2
where p1.ProductCode = p2.ProductCode and p2.EffectDate<=getdate())

你没有完全指定 - 也许@tekBlues的查询是你想要的,或者可能:

SELECT * FROM ProductPriceHistory t1
WHERE t1.EffectDate =
  (SELECT MAX(t2.EffectDate)
   FROM ProductPriceHistory t2
   WHERE t2.IsActive=true)
  AND t1.IsActive=true

获得给定产品代码的使用价值:

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

假设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的新行来激活产品。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM