如何从 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 表中提取第二高的产品使用率?的主要内容,如果未能解决你的问题,请参考以下文章