如何从 SQL 服务器 table 中提取第二高的产品使用率?

How can I pull out the second highest product usage from a SQL Server table?

我们有软件的产品用途 table。它有4个字段,[产品名称]、[使用月份]、[用户]和[国家]。出于许可目的,我们必须按国家和产品名称报告数据。我们的规则是报告每个产品在每个国家/地区的第二大用户数。相同的产品可以在所有国家使用。它基于每月使用量,因此 2020 财年的第二个高峰使用量。由于所有数据都在一个 table 中,我无法弄清楚 SQL 以从 table.

我想我需要做多个 selects(内部 select?)并以某种方式对数据进行分组以提取产品名称、使用高峰期和国家/地区。但这正是我对最佳方法感到困惑的地方。

示例数据如下所示:

[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

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

中使用它

如果我没听错:

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

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

对于一个国家来说应该相当简单。这是我的头顶,但应该做一些调整。这来自您的 table 个名字,这可能有点不对(对吧?)。

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

我不太了解您的数据是如何输入的,以便更好地存储数据以获取您需要的报告信息。

您可以使用它,它 returns 按第一国家和第二产品分组的第二高用户数。请注意,当每个国家和产品只有 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