如何从 SQL Server 表中提取第二高的产品使用率?

Posted

技术标签:

【中文标题】如何从 SQL Server 表中提取第二高的产品使用率?【英文标题】:How can I pull out the second highest product usage from a SQL Server table? 【发布时间】:2021-03-01 21:31:49 【问题描述】:

我们有一个软件产品使用表。它有4个字段,[产品名称]、[使用月份]、[用户]和[国家]。出于许可目的,我们必须按国家和产品名称报告数据。我们的规则是针对每种产品报告每个国家/地区的第二高用户数。相同的产品可以在所有国家使用。它基于每月的使用量,因此是 2020 财年的第二个高峰使用量。由于所有数据都在一个表中,我无法找出 SQL 以从表中获取我需要的信息。

我认为我需要进行多项选择(内部选择?)并将数据分组以提取产品名称、峰值使用量和国家/地区。但这就是我对最佳方法感到困惑的地方。

示例数据如下所示:

[product name], [usage month], [users], [Country]
Product1    January 831 United States of America 
Product1    December    802 United States of America
Product1    September   687 United States of America
Product1    August  407 United States of America
Product1    July    799 United States of America
Product1    June    824 United States of America
Product1    April   802 United States of America
Product1    May 796 United States of America
Product1    February    847 United States of America
Product1    March   840 United States of America
Product1    November    818 United States of America
Product1    October 841 United States of America
Product2    March   1006    United States of America
Product2    February    1076    United States of America
Product2    April   890 United States of America
Product2    May 831 United States of America
Product2    September   538 United States of America
Product2    October 1053    United States of America
Product2    July    673 United States of America
Product2    August  87  United States of America
Product2    November    994 United States of America
Product2    January 1042    United States of America
Product2    December    952 United States of America
Product2    June    873 United States of America

我最初考虑将其拆分为多个表,然后针对每个产品表尝试 sql,但由于这是我需要每月执行的操作,我不想重新设计加载数据的 ETL,因为 1 )我无法控制 ETL 和 2)我觉得这对于重复性任务来说是一种倒退。我们也在研究 Power BI 来为我们做这件事,但还没有找到正确的方法,老实说,我宁愿在 SQL 中使用它。

【问题讨论】:

见***.com/q/8752458/1187211 【参考方案1】:

如果我没听错的话:

select *
from (
    select t.*,
        row_number() over(partition by product_name, country order by users desc) rn
    from mytable t
) t
where rn = 2

这会为每个产品和国家/地区生成一行,对应于第二高的用户数。

【讨论】:

分区依据是一个分组依据,因此如果您只想要按产品或国家/地区划分,您将删除必要的列。这是正确的答案。 这非常适合我的需求,当我根据我的手工作业对其进行抽查时,一切都很好。谢谢。【参考方案2】:

对于一个国家来说,这应该相当简单。这不是我的想法,但应该做一些调整。这来自您的表名,这很可能是错误的(对吗?)。

SELECT top 2 users
FROM ProductCounts
WHERE County = @Country
ORDER BY users DESC
LIMIT 1;

我并不真正了解您的数据是如何输入的,无法很好地了解一种更好的数据存储方式,以获得您想要的报告信息。

【讨论】:

【参考方案3】:

您可以使用它,它返回按第一个国家和第二个产品分组的第二高用户数。请注意,当每个国家和产品只有 1 个用户计数时,它不会显示,每个国家和产品必须至少有两个用户计数。

SELECT 
    country, product, users 
FROM 
    ProductCounts
WHERE 
   (SELECT COUNT(*) FROM ProductCounts AS p 
    WHERE 
        p.country = ProductCounts.country 
    AND 
        p.product = ProductCounts.product
    AND 
        p.users >= ProductCounts.users ) = 2
GROUP BY
    country, product

【讨论】:

以上是关于如何从 SQL Server 表中提取第二高的产品使用率?的主要内容,如果未能解决你的问题,请参考以下文章

176. 第二高的薪水

LeetCode176——第二高的薪水

LeetCode--176--第二高的薪水

查找Salesperson第二高的销售SQL

leecode的sql练习之第二高的薪水

LeetCode - 176. 第二高的薪水