![]() | |
![]() |
| | Thread Tools | Display Modes |
#1
| |||
| |||
|
#2
| |||
| |||
|
#3
| |||
| |||
|
|
The derived table gets expanded in the query plan so it doesn't really read the data twice. Here are two more solutions, the first one being ANSI compliant and should perform good, assuming you have appropriate indexes: SELECT C.ID, C.NAME, P.AMT, P.PDATE FROM CUSTOMER AS C JOIN (SELECT AMT, PDATE, PID, CID, * * * * * * * ROW_NUMBER() OVER(PARTITION BY CID ORDER BY AMT DESC) AS rk * * * *FROM PURCHASE * * * *WHERE PID = 10 * * * * *AND PDATE BETWEEN '20100101' and '20101231') AS P * *ON P.CID = C.ID WHERE rk = 1; SELECT C.ID, C.NAME, A.AMT, A.PDATE FROM CUSTOMER AS C CROSS APPLY (SELECT TOP (1) AMT, PDATE, PID, CID * * * * * * * FROM PURCHASE AS P * * * * * * * WHERE P.PID = 10 * * * * * * * * AND P.CID = C.ID * * * * * * * * AND PDATE BETWEEN '20100101' and '20101231' * * * * * * * ORDER BY AMT DESC) AS A; -- Plamen Ratchevhttp://www.SQLStudio.com |
#4
| |||
| |||
|
![]() |
| Thread Tools | |
| Display Modes | |
| |