如何从 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
我们有软件的产品用途 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