通过一个 SQL 查询从多个类别中检索最常见的项目名称及其最高价格
Posted
技术标签:
【中文标题】通过一个 SQL 查询从多个类别中检索最常见的项目名称及其最高价格【英文标题】:Retrieve most common item name and its highest price from multiple categories by one SQL query 【发布时间】:2020-09-08 12:54:40 【问题描述】:我有一个模板表,其中包含每个 TemplateID 的多个 TypeID。 我有一个 Items 表,其中包含 ItemName、ItemPrice 和 TypeID。我需要获取附加到所选模板的每个 TypeID 的该 ItemName 中最常见的 ItemName 和最高价格。 我的查询不起作用,因为由于内部 joi,它显然从 ItemsTable 中为每个 TypeID 返回多行,但我找不到编写查询的方法。 我的查询:
select t.TypeID, t.TemplateID, n.ItemName, n.MaxPrice
from Templates t
inner join (select count(i.ItemName) as foundn, i.ItemName, max(i.ItemPrice) as MaxPrice, i.TypeID
from Items i
group by i.TypeID, i.ItemName) n on n.TypeID=t.TypeID
WHERE t.TemplateID=2;
我想看到的结果是这样的:
模板 ID 1:
TypeID 1 - 常见的商品名称,它们的最高价格 TypeID 2 - 常见的商品名称,它们的最高价格...等
【问题讨论】:
样本数据和预期输出会很有帮助。 请阅读this,了解一些改进问题的技巧。 对不起,我不知道我也可以导入 excel。下次我会用正确的方法做。然而问题得到了回答,这正是我正在寻找的解决方案。 【参考方案1】:试试这个:
WITH DataSource AS
(
select t.TypeID, t.TemplateID, n.ItemName, n.MaxPrice, ROW_NUMBER() OVER (PARTITION BY t.TemplateID, t.TypeID ORDER BY foundn DESC) as rn
from Templates t
inner join
(
select count(i.ItemName) as foundn, i.ItemName, max(i.ItemPrice) as MaxPrice, i.TypeID
from Items i
group by i.TypeID, i.ItemName
) n
on n.TypeID=t.TypeID
WHERE t.TemplateID=2
)
SELECT *
FROM DataSource
WHERE rn = 1
这个想法是使用ROW_NUMBER
为每个模板生成行ID - 类型对从具有最大foundn
的那个开始。然后,仅显示行 ID = 1 的这些。
【讨论】:
以上是关于通过一个 SQL 查询从多个类别中检索最常见的项目名称及其最高价格的主要内容,如果未能解决你的问题,请参考以下文章
仅在一个 SQL 查询中检索所有类别、子类别、子子类别等的完整列表