Select top n records from each category within sam

2019-08-07 12:25发布

问题:

I've a purchase detail table that has item id, purchase date, and item unit cost.

I want to get an avg of an item purchase cost by selecting latest top 2 records from each item id.

Item id, purchase date, unitprice
1        3/1/2012        10
1        3/11/2012        8
2        3/1/2012        10
2        3/11/2012        10
1        2/1/2012        9
3        3/1/2012        10
3        3/11/2012        1
3        3/12/2012        13

I'm using sql server 2008 r2

回答1:

Try this:

;WITH CTE AS (
    SELECT [Item id], [purchase date], unitprice, 
        ROW_NUMBER() OVER(PARTITION BY [Item id] ORDER BY [purchase date] DESC) rn
    FROM your_table
)
SELECT [Item id], [purchase date], unitprice
FROM CTE
WHERE rn < 3

I'm not sure how can you calc avg with latest two records, but sure you can add GROUP BY to the query if you need.

Maybe something like that:

-- CTE here --
SELECT [Item id], AVG(unitprice)
FROM CTE
WHERE rn < 3
GROUP BY [Item id]


回答2:

;WITH CTE AS (
    SELECT    [Item id]
            , [purchase date]
            , [unitprice]
            , [avg] = AVG([unitprice]) OVER(PARTITION BY [Item id])
            , [rnum] =  ROW_NUMBER() OVER(PARTITION BY [Item id] ORDER BY [purchase date] DESC)
    FROM    T
)
SELECT [Item id], [purchase date], [unitprice], [avg]
FROM CTE
WHERE rnum < 3


回答3:

SELECT AVG(unitprice) as price from yourtablename 
 where unitprice IN 
 (
    SELECT TOP 3 (unitprice) from yourtablename
     where itemid='1'
     ORDER BY unitprice Desc
 );

Get the itemid through dropdownlist or textbox. Is't useful to you ?