TSQL加入具有不同值的列

时间:2012-02-09 22:49:18

标签: sql tsql select join

我有一张表格,其中包含每日更改的产品价格,比如说

价格(productID int,price float,dateprice datetime)。

这些价​​格在周末不存在,因此桌面上没有全天价格。

我想要一个带有productId,day,todayPrice,todayPrice的结果(显然第一个日期不会出现在这个结果上,因为它没有前一天)。我认为像这样的联接会给我我想要的东西,但是没有用。

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)

此选择返回空结果,但如果我使用&#34; =&#34;而不是&#34;&lt;&#34;它返回一个包含许多相等行的表(如预期的那样)。

您如何建议我选择此信息?

2 个答案:

答案 0 :(得分:1)

你很亲密..但是如果你将一个产品的价格加到以前的价格上,你就要确保包含产品ID,否则你只是加入任何其他产品的价格

另外,如果p2是前一天的价格...,那么您需要检查以查找小于max (p.dateprice)的{​​{1}}。

p1.dateprice

答案 1 :(得分: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())

CONVERT GETDATE()用于截断日期时间,假设您的dateprice已截断日期时间,即时间为12:00 AM。如果没有,您将需要使用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