需要指导:前端用户动态选择字段的后端 SQL 逻辑

Posted

技术标签:

【中文标题】需要指导:前端用户动态选择字段的后端 SQL 逻辑【英文标题】:Guidance needed: Backend SQL logic for dynamic selection of a field by users in frontend 【发布时间】:2020-05-07 18:37:52 【问题描述】:

我有一个数据集如下:

Country,Commodity,Year,Type,Amount
US,Vegetable,2010,Harvested,2.44
US,Vegetable,2010,Yield,15.8
US,Vegetable,2010,Production,6.48
US,Vegetable,2011,Harvested,6
US,Vegetable,2011,Yield,18
US,Vegetable,2011,Production,3
Argentina,Vegetable,2010,Harvested,15.2
Argentina,Vegetable,2010,Yield,40.5
Argentina,Vegetable,2010,Production,2.66
Argentina,Vegetable,2011,Harvested,15.2
Argentina,Vegetable,2011,Yield,40.5
Argentina,Vegetable,2011,Production,2.66
Bhutan,Vegetable,2010,Harvested,7
Bhutan,Vegetable,2010,Yield,35
Bhutan,Vegetable,2010,Production,5
Bhutan,Vegetable,2011,Harvested,2
Bhutan,Vegetable,2011,Yield,6
Bhutan,Vegetable,2011,Production,3

鉴于:

    如果任何一个国家的数据中有 n 年,所有其他国家也应该有相同的 n 年。例如:如果美国有 2011 年和 2012 年的数据,那么所有其他国家/地区都会有 2011 年和 2012 年的数据。

条件:

    聚合仅发生在多国选择时。分组将按商品和年份。

例如:如果前端工具中的用户选择美国和阿根廷,我们必须显示 -

派生产量 =(美国收获 + 阿根廷收获)/(美国产量 + 阿根廷产量),即 (2.44+15.2)/(6.48+2.66),同样,对于三个国家,这将是三个收获值的增加除以三个产值的增加,依此类推。必须在新行中填充。

注意:前端用户可以选择任意国家组合。在后端而不是在前端动态地执行它的唯一目的是因为 AWS QuickSight(我们的可视化工具),即使可以在选定的列过滤器上填充总和,但还不支持对那些派生的总和字段进行计算。因此,必须预先填充所有国家/地区组合的整个计算(非常幼稚的方法),以使其在报告中可用。

我对所有 SQL 专家的两个问题是:

如何填充按年份和商品分组的所有国家组合的行,以便它包含所有可能组合的数据。 鉴于我可以填充所有行组合,报告工具将如何了解根据用户选择的国家/地区选择哪个派生行,因为该行标记为 US+Argentina,该行为 US+Bhutan,等

非常欢迎任何解决方案。

首选 SQL 工具:Spark SQL 或 Athena SQL(在 Presto 上运行)或 HiveQL。 不太喜欢:Oracle、PGSQL

注意 2:发布此问题的唯一目的是,尽管我在另一个问题中已经详细阐述了相同的问题,但因为我不想将我的幼稚方法强加给试图解决问题的人问题,所以在这里,我已经比在解决方案中寻求帮助更清楚地定义了问题。而在另一个问题中,我已经给出了预期结果的方法。如果您想查看其他问题,请here it is。

【问题讨论】:

【参考方案1】:

你可以这样开始:

select * from
(
    select c.Country, y.Year
    from
    (select distinct Country from table) as c,
    (select distinct Year from table) as y
) as cy
left join table as t on t.Country = cy.Country and t.Year = cy.Year

这将为您提供包含国家/地区的所有组合的所有行以及主表中的可选数据,因此您现在可以添加过滤器/分组

【讨论】:

我不想查看年份的组合,对于任何国家/地区组合,相应的金额应按商品和年份汇总。 突出显示问题中的公式。 @AakashBasu 您的第一个问题是How can I populate the rows of all combination of countries grouped by year - 我向您展示了如何做到这一点,基于此您可以扩展/添加更多分组/公式 我想我必须跑一下看看结果,我会告诉你结果。如果您愿意,您还可以浏览此问题底部的链接问题,以深入了解需求。

以上是关于需要指导:前端用户动态选择字段的后端 SQL 逻辑的主要内容,如果未能解决你的问题,请参考以下文章

美多商城项目之用户登录页面后端实现

用户登陆模块的后端实现

借鉴一个比较标准的后端RESTful API

SQL优化:慎用标量子查询,改用left join提升查询效率

【SpringBoot】2022-03-26【自定义请求转发、分发】

常见的后端框架