gpt4 book ai didi

sql - T-Sql 按 MIN() 选择和分组

转载 作者:行者123 更新时间:2023-12-02 01:27:04 24 4
gpt4 key购买 nike

我有 3 个表:

ProductCategory [1 - m] Product [1-m] ProductPrice

像这样的简单脚本:

select pc.CategoryId ,pp.LanguageId , pp.ProductId ,pp.Price
from ProductCategory as pc
inner join Product as p on pc.ProductId = p.Id
inner join ProductPrice as pp on p.Id = pp.ProductId
order by CategoryId , LanguageId , ProductId

显示这些表格数据:

CategoryId  LanguageId  ProductId   Price
----------- ----------- ----------- ---------------------------------------
1 1 1 55.00
1 1 2 55.00
1 2 1 66.00
1 2 2 42.00
2 1 3 76.00
2 1 4 32.00
2 2 3 89.00
2 2 4 65.00
4 1 4 32.00
4 1 5 77.00
4 2 4 65.00
4 2 5 85.00

现在我需要的是:对于每个类别,按原样获取整行,但仅包含具有最低价格的产品。

我刚刚写了一个简单的查询,就像这样:

with dbData as
(
select pc.CategoryId ,pp.LanguageId , pp.ProductId ,pp.Price
from ProductCategory as pc
inner join Product as p on pc.ProductId = p.Id
inner join ProductPrice as pp on p.Id = pp.ProductId
)
select distinct db1.*
from dbData as db1
inner join dbData as db2 on db1.CategoryId = db2.CategoryId
where db1.LanguageId = db2.LanguageId
and db1.Price = (select Min(Price)
from dbData
where CategoryId = db2.CategoryId
and LanguageId = db2.LanguageId)

它的结果是正确的:

CategoryId  LanguageId  ProductId   Price
----------- ----------- ----------- ---------------------------------------
1 1 1 55.00
1 1 2 55.00
1 2 2 42.00
2 1 4 32.00
2 2 4 65.00
4 1 4 32.00
4 2 4 65.00

有没有更酷的方法来做到这一点?

注意:查询必须符合Sql-Server 2008 R2+

最佳答案

你可以使用像RANK() 这样的窗口函数:

WITH cte AS 
(
select pc.CategoryId, pp.LanguageId, pp.ProductId, pp.Price,
rnk = RANK() OVER(PARTITION BY pc.CategoryId ,pp.LanguageId ORDER BY pp.Price)
from ProductCategory as pc
join Product as p on pc.ProductId = p.Id
join ProductPrice as pp on p.Id = pp.ProductId
)
SELECT CategoryId, LanguageId, ProductId, Price
FROM cte
WHERE rnk = 1;

LiveDemo

关于sql - T-Sql 按 MIN() 选择和分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36534362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com