2012-02-09 56 views
1

我有一个表,每日更换的产品的价格,可以说TSQL加入的列具有不同值

价格(INT的productID,价格浮动,dateprice日期时间)。

这些价格在周末不存在,所以并不是所有的天价都在桌上。

我想要一个productId,day,todayPrice,yesterdayPrice的结果(显然第一个日期不会出现在这个结果上,因为它没有前一天)。我认为像这样的加入会给我我想要的,但不起作用。

select p1.productId, p1.dateprice, p1.price, p2.price 
from price p1 
inner join price pr ON pr.productId = p1.productId 
inner join price p2 ON p1.dateprice = (select max (p.dateprice) 
             from price p 
             where p.dateprice < p1.dateprice) 

这个选择返回一个空的结果,但如果我用“=”,而不是“<”返回我有许多相同的行表(如预期)。

你如何建议我选择这些信息?

+0

你没有引用'p2'你'ON'子句。 – HABO 2012-02-09 22:53:22

+0

编辑之后...我不确定'pr'有什么用。为什么从'p1'连接到'pr'? – 2012-02-09 23:01:37

回答

1

您已经接近..但如果您将一件产品的价格加入之前的价格,您需要确保您包含产品ID,否则您只需加入其他任何产品价钱。

此外,如果p2是前一天的价格...这是您将检查以查找小于p1.datepricemax (p.dateprice)的日期。

select 
    p1.productId, p1.dateprice, 
    p1.price as todayPrice, p2.price as yesterdayPrice 
from price p1 
inner join price p2 
    on p1.productId = p2.productId 
    and p2.dateprice = (
     select max (p.dateprice) 
     from price p 
     where 
      p.dateprice < p1.dateprice 
      and p.productId = p1.productId 
    ) 
+0

谢谢,兄弟,但我忘了发布第一个开启条件,productId。这是在我原来的查询,但尽管如此,查询仍然无法正常工作。我刚刚编辑原始帖子。 – user1200835 2012-02-09 22:59:40

1

你是在正确的轨道,只是改变你的加入条件,如:

select p1.productId, p1.dateprice, p1.price, p2.price 
from price p1 
inner join price p2 ON p1.productId = p2.productId AND p1.dateprice = DATEADD(day, -1, p2.dateprice) AND p2.dateprice = CONVERT(VARCHAR, GETDATE()) 

GETDATE()CONVERT用于截断日期时间,假设你dateprice已经有了截断日期时间,即时间是凌晨12:00。如果没有,你需要使用CONVERT来做到这一点。如果你想使用MAX()代替以获得最新的一个,你最好使用CROSS APPLY

select p1.productId, p1.dateprice, p1.price, p2.price 
    from price p1 
    CROSS APPLY (select TOP 1 p.price 
FROM price p WHERE p.productId = p1.productId ORDER BY p.dateprice DESC) p2