如何解决如何转换查询以使用联接?
我想编写一个查询,该查询使用“联接概念”来为每个订单返回自同一位客户的先前订单以来经过的天数。
我正在使用AdventureWorks2017
数据库的表Sales.SalesOrderHeader
我尝试了以下代码,但实际上我希望通过联接概念来实现它:
select customerid,orderdate,salesorderid,datediff(day,(select top(1) s1.orderdate
from sales.SalesOrderHeader s1
where s1.CustomerID=s.CustomerID
and (s1.OrderDate = s.Orderdate
and s1.SalesOrderID < s.Salesorderid
or s1.OrderDate < s.orderdate)
order by s1.orderdate desc,s1.SalesOrderID desc
),orderdate) as Daysdifference
from sales.SalesOrderHeader s
order by CustomerID,OrderDate,SalesOrderID
解决方法
从现有查询开始,一种简单的方法是使用横向联接:
select s.customerid,s.orderdate,s.salesorderid,datediff(day,s1.orderdate) days_difference
from sales.salesorderheader s
cross apply (
select top(1) s1.orderdate
from sales.salesorderheader s1
where s1.customerid = s.customerid
and (s1.orderdate < s.orderdate) or (s1.orderdate = s.orderdate and s1.id < s.id)
order by s1.orderdate desc,s1.id desc
) s1
这回答了您关于如何通过联接实现逻辑的问题。但是,我要指出的是,使用lag()
可以更有效地表达这一点:
select customerid,orderdate,salesorderid,lag(orderdate) over(partition by customer_id order by order_date,id) days_difference
from sales.salesorderheader s
,
我会这样写
SELECT s.CustomerID,s.OrderDate,s.SalesorderID,s1.OrderDate,s.OrderDate) as Daysdifference
FROM sales.SalesOrderHeader s
OUTER APPLY (
SELECT top(1) s1.OrderDate-- maybe MAX(s1.OrderDate) ?
FROM sales.SalesOrderHeader s1
WHERE s1.CustomerID = s.CustomerID
AND ((s1.OrderDate = s.OrderDate
AND s1.SalesOrderID < s.SalesOrderID) -- I've added parenthesis
OR s1.OrderDate < s.OrderDate)
ORDER BY s1.OrderDate DESC,s1.SalesOrderID DESC
) s1
ORDER BY s.CustomerID,s.SalesOrderID
或者类似的东西?
SELECT s.customerID,s.orderDate,s.SalesOrderID,MAX(s1.OrderDate),s.OrderDate) as Daysdifference
FROM sales.SalesOrderHeader s
LEFT JOIN sales.SalesOrderHeader s1 ON s1.CustomerID = s.CustomerID
AND ((s1.OrderDate = s.OrderDate
AND s1.SalesOrderID < s.SalesOrderID) -- I've added parenthesis
OR s1.OrderDate < s.OrderDate))
GROUP BY s.CustomerID,s.salesorderId
ORDER BY s.CustomerID,s.SalesOrderID
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。