SQL - проблема с SQL-запросом; группировать и присоединиться - PullRequest
1 голос
/ 09 июня 2009

Предположим, у меня есть таблица с именем [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

Ответы [ 4 ]

2 голосов
/ 09 июня 2009
select * from ProductPriceHistory p1
where EffectDate = 
(select max(EffectDate) from ProductPriceHistory p2
where p1.ProductCode = p2.ProductCode and p2.EffectDate<=getdate())
1 голос
/ 09 июня 2009

, чтобы получить значение данного кода продукта, используйте:

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
1 голос
/ 09 июня 2009

вы не совсем указали полностью - возможно, запрос @tekBlues - это то, что вам нужно, или, может быть:

SELECT * FROM ProductPriceHistory t1
WHERE t1.EffectDate =
  (SELECT MAX(t2.EffectDate)
   FROM ProductPriceHistory t2
   WHERE t2.IsActive=true)
  AND t1.IsActive=true
0 голосов
/ 09 июня 2009

Предполагая, что 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.

edit: я понимаю, что я относился к активным иначе, чем вы - я предполагал, что IsActive применяется только к определенной EffectDate, но я вижу, что вы деактивируете весь продукт, установив для его IsActive значение false. Я обновил соответствующим образом, предполагая, что вы можете впоследствии активировать продукт, создав новую строку с IsActive = true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...