, .
TOP-n
, 13 2008 .
,
(2) .
, :
RowID Category ID Description Price
1 Pot A1 Small Saucepan 21.50
2 Pot A2 1 Qt Saucepan 29.95
3 Pot A3 1.5 Qt Saucepan 33.95
4 Pot A4 Double Boiler 39.50
5 Pot A5 Stewpot 49.50
6 Pot A6 Pressure Cooker 79.95
7 Pan B1 8" Pie 6.95
8 Pan B2 8" Sq Cake 7.50
9 Pan B3 Bundt Cake 12.50
10 Pan B4 9x12 Brownie 7.95
11 Bowl C1 Lg Mixing 27.50
12 Bowl C2 Sm Mixing 17.50
13 Tools T1 14" Spatula 9.95
:
RowID Category ID Description Price
11 Bowl C1 Lg Mixing 27.50
12 Bowl C2 Sm Mixing 17.50
9 Pan B3 Bundt Cake 12.50
10 Pan B4 9x12 Brownie 7.95
6 Pot A6 Pressure Cooker 79.95
5 Pot A5 Stewpot 49.50
13 Tools T1 14" Spatula 9.95
.
SQL Server 2005/SQL Server 2008,
SQL Server 2000.
SET NOCOUNT ON
DECLARE @MyTable table
( RowID int IDENTITY,
Category varchar(5),
[ID] varchar(5),
[Description] varchar(25),
Price decimal(10,2)
)
INSERT INTO @MyTable VALUES ( 'Pot', 'A1', 'Small Saucepan', 21.50 )
INSERT INTO @MyTable VALUES ( 'Pot', 'A2', '1 Qt Saucepan', 29.95 )
INSERT INTO @MyTable VALUES ( 'Pot', 'A3', '1.5 Qt Saucepan', 33.95 )
INSERT INTO @MyTable VALUES ( 'Pot', 'A4', 'Double Boiler', 39.50 )
INSERT INTO @MyTable VALUES ( 'Pot', 'A5', 'Stewpot', 49.50 )
INSERT INTO @MyTable VALUES ( 'Pot', 'A6', 'Pressure Cooker', 79.95 )
INSERT INTO @MyTable VALUES ( 'Pan', 'B1', '8"" Pie', 6.95 )
INSERT INTO @MyTable VALUES ( 'Pan', 'B2', '8"" Sq Cake', 7.50 )
INSERT INTO @MyTable VALUES ( 'Pan', 'B3', 'Bundt Cake', 12.50 )
INSERT INTO @MyTable VALUES ( 'Pan', 'B4', '9x12 Brownie', 7.95 )
INSERT INTO @MyTable VALUES ( 'Bowl', 'C1', 'Lg Mixing', 27.50 )
INSERT INTO @MyTable VALUES ( 'Bowl', 'C2', 'Sm Mixing', 17.50 )
INSERT INTO @MyTable VALUES ( 'Tools', 'T1', '14"" Spatula', 9.95 )
Return to Top
SQL Server 2005/SQL Server 2008
SELECT
RowID,
Category,
[ID],
[Description],
Price
FROM (SELECT
ROW_NUMBER() OVER ( PARTITION BY Category ORDER BY Price DESC ) AS 'RowNumber',
RowID,
Category,
[ID],
[Description],
Price
FROM @MyTable
) dt
WHERE RowNumber <= 2
RowID Category ID Description Price
11 Bowl C1 Lg Mixing 27.50
12 Bowl C2 Sm Mixing 17.50
9 Pan B3 Bundt Cake 12.50
10 Pan B4 9x12 Brownie 7.95
6 Pot A6 Pressure Cooker 79.95
5 Pot A5 Stewpot 49.50
13 Tools T1 14" Spatula 9.95
Return to Top
SQL Server 2005 / SQL Server 2008 solution using CTE (Added by: Jacob Sebastian)
;WITH dt AS (
SELECT
ROW_NUMBER() OVER ( PARTITION BY Category ORDER BY Price DESC ) AS 'RowNumber',
RowID,
Category,
[ID],
[Description],
Price
FROM @MyTable
)
SELECT
RowID,
Category,
[ID],
[Description],
Price
FROM dt
WHERE RowNumber <= 2
RowID Category ID Description Price
11 Bowl C1 Lg Mixing 27.50
12 Bowl C2 Sm Mixing 17.50
9 Pan B3 Bundt Cake 12.50
10 Pan B4 9x12 Brownie 7.95
6 Pot A6 Pressure Cooker 79.95
5 Pot A5 Stewpot 49.50
13 Tools T1 14" Spatula 9.95
Return to Top
SQL 2000 Solution
SELECT DISTINCT
RowID,
Category,
[ID],
[Description],
Price
FROM @MyTable t1
WHERE RowID IN (SELECT TOP 2
RowID
FROM @MyTable t2
WHERE t2.Category = t1.Category
ORDER BY Price DESC
)
ORDER BY
Category,
Price DESC
RowID Category ID Description Price
11 Bowl C1 Lg Mixing 27.50
12 Bowl C2 Sm Mixing 17.50
9 Pan B3 Bundt Cake 12.50
10 Pan B4 9x12 Brownie 7.95
6 Pot A6 Pressure Cooker 79.95
5 Pot A5 Stewpot 49.50
13 Tools T1 14" Spatula 9.95
From: Select TOP n Rows for each group.