通过一个 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 查询

仅在一个 SQL 查询中检索所有类别、子类别、子子类别等的完整列表

手动检索带有 JSON 类别/标签的 Wordpress 帖子

用于从多个表中检索数据的 Sql 查询

查找最佳类别匹配的 SQL 查询

WordPress:我如何通过 sql 将所有帖子从体育类别转换为新闻类别 [关闭]