Sql server SQL Server-为每个FK选择前5行
我有以下查询,它查找与搜索匹配的前5个产品。每个产品都与一个商店相关联 从产品中选择前5个* p、 p.ShopId所在的商店= s、 类似ShopId和p.ProductName “%christmas%” 我需要扩展此功能,以便它返回每个商店的前5种产品Sql server SQL Server-为每个FK选择前5行,sql-server,greatest-n-per-group,Sql Server,Greatest N Per Group,我有以下查询,它查找与搜索匹配的前5个产品。每个产品都与一个商店相关联 从产品中选择前5个* p、 p.ShopId所在的商店= s、 类似ShopId和p.ProductName “%christmas%” 我需要扩展此功能,以便它返回每个商店的前5种产品 有人能告诉我如何修改查询以实现此目的吗?-i、 e.选择每家店铺中与%christmas%匹配的前五名产品,而不是显示所有店铺中与%christmas%匹配的前五名产品的当前产品。您实际上缺少一个ORDER BY以使前五名有意义,或任何基于
有人能告诉我如何修改查询以实现此目的吗?-i、 e.选择每家店铺中与%christmas%匹配的前五名产品,而不是显示所有店铺中与%christmas%匹配的前五名产品的当前产品。您实际上缺少一个ORDER BY以使前五名有意义,或任何基于行号的解决方案,需要ORDER BY
SELECT
*
FROM
Shops s
CROSS APPLY (
SELECT TOP 5
*
FROM
Products p
WHERE
p.ShopId = s.ShopId AND p.ProductName LIKE '%christmas%'
ORDER BY --added on edit
???
) X
试试这个:
select * from (
select *, rn = row_number() over (partition by s.ShopId order by p.ProductName)
from Products p, Shops s
where p.ShopId = s.ShopId AND p.ProductName LIKE '%christmas%'
) a where a.rn <= 5
试试这个
SELECT DISTINCT
A.Product_Group_code
,B.Sub_Product_Group_code
,A.Product_code
,A.Product_name
FROM dbo.A A
LEFT JOIN dbo.B B
ON A.Product_code = B.Product_code
WHERE B.Product_code IN
(
SELECT TOP 5 E.Product_code
FROM dbo.A D
LEFT JOIN dbo.B E
ON D.Product_code = E.Product_code
WHERE E.Sub_Product_Group_code = B.Sub_Product_Group_code
)
AND B.Sub_Product_Group_code IS NOT NULL
ORDER BY B.Sub_Product_Group_code,A.Product_name
这是我刚刚找到的一个很好的解决方案 为每个组选择前n行 阿尼·罗兰,2008年3月13日 每个类别都有多行,并且希望 按价格仅选择每个类别前两行。 例如,根据以下数据:
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的解决方案
为两种解决方案创建示例数据
-- Suppress data loading messages
SET NOCOUNT ON
-- Create Sample Data using a Table Varable
DECLARE @MyTable table
( RowID int IDENTITY,
Category varchar(5),
[ID] varchar(5),
[Description] varchar(25),
Price decimal(10,2)
)
-- Load Sample Data
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解决方案
--Query to Retrieve Desired Data
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
-- Results
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
From:What db please:MySQL、SQL Server等?实际的查询使用FTE进行全文搜索-按排名排序-为了清晰起见,从这里的示例中去掉了这一点:-请记住,您需要为前5名的查询添加一个别名才能使其工作。e、 交叉应用选择前5名。。。AS p
-- Define a CTE with the name "dt"
;WITH dt AS (
SELECT
ROW_NUMBER() OVER ( PARTITION BY Category ORDER BY Price DESC ) AS 'RowNumber',
RowID,
Category,
[ID],
[Description],
Price
FROM @MyTable
)
-- and select the data from the CTE
SELECT
RowID,
Category,
[ID],
[Description],
Price
FROM dt
WHERE RowNumber <= 2
-- Results
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
--Query to Retrieve Desired Data
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
-- Results
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