我有一张表格,其中包含每日更改的产品价格,比如说
价格(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;它返回一个包含许多相等行的表(如预期的那样)。
您如何建议我选择此信息?
答案 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