In MS Transact SQL, let's say I have a table (Orders) like this:
Order Date Order Total Customer #
09/30/2008 8.00 1
09/15/2008 6.00 1
09/01/2008 9.50 1
09/01/2008 1.45 2
09/16/2008 4.50 2
09/17/2008 8.75 3
09/18/2008 2.50 3
What I need out of this is: for each customer the average order amount for the most recent two orders. So for Customer #1, I should get 7.00 (and not 7.83).
I've been staring at this for an hour now (inside a larger problem, which I've solved) and I think my brain has frozen. Help for a simple problem?
This should make it
select avg(total), customer
from orders o1
where orderdate in
( select top 2 date
from orders o2
where o2.customer = o1.customer
order by date desc )
group by customer
In SQL Server 2005 you have the RANK function, used with partition:
USE AdventureWorks;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
,RANK() OVER
(PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS 'RANK'
FROM Production.ProductInventory i
INNER JOIN Production.Product p
ON i.ProductID = p.ProductID
ORDER BY p.Name;
GO
One option would be for you to use a cursor to loop through all the customer Id's, then do the averages as several subqueries.
Fair warning though, for large datasets, queries are not very efficient and can take a long time to process.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.