SQL获取每月和所有月份最高值的行

标签 sql hana

我需要一些帮助来编写满足以下要求的 SQL 语句(最终结果)。

注意:我正在使用 SQL 语法在 SAP HANA 系统(数据库)上编写此 SQL。 SQL 语法通常被普遍使用。

用于列名的一些缩写:

cust = customer
ctry = country
mth = month
HCostPP = Highest cost per period
HCtryPP = highest country per period
HCostAP = Highest cost over all periods
HCtryAP = highest country over all periods

我的源表中有粒度数据。通过像下面这样编写 SQL,我得到了聚合数据:
SELECT distinct cust,ctry,mth,sum(cost)
FROM mytable
GROUP BY cust,ctry,mth

I get aggregated data like which i used further to get my required results:  
cust  ctry  mth     cost
c001   US  201506  -100
c001   DK  201506  -100
c001   DE  201506  -50
c001   FR  201507  -200
c001   UK  201507   -50

最终要求的结果 我想实现应该如下所示:
cust   ctry  mth   cost  HCostPP HCtryPP HCostAP HCtryAP
c001   US  201506  -100  -100    DK      -200    FR
c001   DK  201506  -100  -100    DK      -200    FR
c001   DE  201506  -50   -100    DK      -200    FR
c001   FR  201507  -200  -200    FR      -200    FR
c001   UK  201507   -50  -200    FR      -200    FR

所需结果说明
based on data group (cust,ctry,mth) need to get for which 
country COST were hightest 'within each month' (HCostPP , HCtryPP)
and then again 'over all months'(HCostAP , HCtryAP).

捕捉
for month 201506, -100 cost is same for both US and DK. 
In this case take either one e.g. DK or US (i am showing above to take DK)

我试过的:
我知道需要两个左连接。第一个左连接应该如下所示以获得 HCostPP , HCtryPP :
LEFT SIDE                            RIGHT SIDE
cust   ctry  mth   cost          cust   ctry  mth   cost
c001   US  201506  -100          c001   DK  201506  -100
c001   DK  201506  -100          c001   FR  201507  -200
c001   DE  201506  -50
c001   FR  201507  -200
c001   UK  201507   -50

为了获得右侧表,当我编写 SQL 时:
SELECT cust,ctry,mth, MIN(cost)
FROM
(
SELECT distinct cust,ctry,mth,sum(cost)
FROM mytable
GROUP BY cust,ctry,mth
)
GROUP BY cust,ctry,mth

i don't get the required result, i get:
cust   ctry  mth   cost
c001   US  201506  -100
c001   DK  201506  -100
c001   DE  201506  -50
c001   FR  201507  -200
c001   UK  201507   -50

if i do like: 
SELECT cust,mth, MIN(cost)
FROM
(
SELECT distinct cust,ctry,mth,sum(cost)
FROM mytable
GROUP BY cust,ctry,mth
)
GROUP BY cust,mth

then i get below and i lose 'cntry' column:
cust     mth   cost
c001     201506  -100
c001     201507  -200

此外,如果我使用 INNER JOIN 来获取“cntry”列:
SELECT cust,mth,ctry,cost FROM mytable AS 'main'
INNER JOIN (
SELECT cust,mth, MIN(cost) as cost1
FROM
(
SELECT distinct cust,ctry,mth,sum(cost)
FROM mytable
GROUP BY cust,ctry,mth
)
GROUP BY cust,mth ) AS 'sub'
ON main.cust=sub.cust, main.mnth=sub.mnth, main.cost=sub.cost1

then this gives me what is also not desired as 
it is giving me both rows i.e. for US and DK and i need only one here: 
cust   ctry  mth   cost
c001   US  201506  -100
c001   DK  201506  -100
c001   FR  201507  -200

我非常感谢在编写 SQL 以实现上述所需结果(部分最终要求的结果)方面的任何帮助。

感谢您的帮助。/问候/诺曼

最佳答案

这是第一部分,对于 PerPeriod 结果,您应该使用 over (partion by) 构造(这是很好的描述 here

select 
 t1.cust,
 t1.ctry,
 t1.mth,
 t1.cost,
 (select t3.ctry from mytable t3 order by t3.cost asc limit 1)  HCtryAP,
 min(t2.cost) HCostAP
from mytable t1, mytable t2
group by 1,2,3
order by 3, 4;

关于SQL获取每月和所有月份最高值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38126591/

相关文章:

自动代码生成期间的 Java equals() 和 hashcode()

c# - SQL 表引用多个外键,同时定义顺序并保证参照完整性

sql - MSSQL 中带有 XML 查询的存储过程参数给出 "argument must be string literal"

python - 从选择结果创建表失败,错误 292 "wrong number of arguments: "

mysql - 我如何连接 2 个查询?

sql - 选项(重新编译)总是更快;为什么?

sql - 如何连接 sap hana 表中的多行字段

hadoop - 通过sqoop在汉娜上导入sap bw

python - PyHDB 和 HANA 客户端的 hdbcli python 包有什么区别?

c# - HANA服务层: Could not establish trust relationship for the SSL/TLS secure channel