Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有不同值的列上的TSQL联接_Sql_Tsql_Select_Join - Fatal编程技术网

具有不同值的列上的TSQL联接

具有不同值的列上的TSQL联接,sql,tsql,select,join,Sql,Tsql,Select,Join,比如说,我有一张每天都在变化的产品价格表 price productID int,price float,dateprice datetime 这些价格在周末并不存在,因此并非所有的日子都有价格 我想要一个productId为day、todayPrice、yesterdayPrice的结果。显然,第一个日期不会出现在这个结果上,因为它不是前一天。我以为这样的加入会给我想要的,但没有成功 select p1.productId, p1.dateprice, p1.price, p2.price f

比如说,我有一张每天都在变化的产品价格表

price productID int,price float,dateprice datetime

这些价格在周末并不存在,因此并非所有的日子都有价格

我想要一个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)

此选择返回一个空结果,但如果我使用=而不是,您就接近了。。但是,如果要将一个产品的价格加入到以前的价格中,则需要确保包含产品Id,否则您将只加入到任何其他产品的价格中

另外,如果p2是前一天的价格。。。这是您要检查以查找小于p1.dateprice的最大p.dateprice的日期


您所处的轨道正确,只需更改加入条件,如下所示:

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用于截断datetime,假设您的dateprice已经截断了datetime,即时间为12:00AM。如果没有,则需要使用CONVERT来执行此操作。如果要使用MAX来获取最新版本,最好使用交叉应用:


您没有在ON子句中引用p2。编辑后。。。我不知道公关是做什么的。为什么要从p1加入pr?谢谢,兄弟,但我忘了发布第一个条件,productId。这是我最初的查询,但尽管如此,查询仍然不起作用。我刚刚编辑了原稿。
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())
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