用HANA SQL中的窗口功能ROW_NUMBER分配组号

问题描述 投票:0回答:1

我必须在这里键入很多文本才能允许我发布此内容。

[请忽略此文本,然后在下面查看我的问题。

我具有带分区的以下代码:

SELECT rownum,"SRNUM" ,
"SRAnalyzeddate",
"Account",
"U_USD_TOTAL_POTENTIAL_NNACV",
"U_USD_TOTAL_UNDEPLOYED_BACKLOG",
"U_USD_TOTAL_UNDER_SUBSCRIBED", 
"DV_U_BUSINESS_UNIT",
"CUSTOMER_SINCE",
"ContractEnd",
"Segment",
"Industry",
"Territory",    
"Vertical",
"FIELD_GEO",
"FIELD_MAJOR_AREA",
"FIELD_AREA"
 FROM 
 (
select SR."NUMBER" AS "SRNUM" ,SR."U_ANALYZED_DATE" AS "SRAnalyzeddate",SR."DV_SALES_ACCOUNT" AS "Account","U_USD_TOTAL_POTENTIAL_NNACV", 
"U_USD_TOTAL_UNDEPLOYED_BACKLOG","U_USD_TOTAL_UNDER_SUBSCRIBED", "DV_U_BUSINESS_UNIT","CUSTOMER_SINCE",
acc."U_NEW_SEGMENT" AS "Segment",
acc."DV_INDUSTRY" As "Industry",
acc."DV_U_ACCOUNT_TERRITORY" As "Territory",    
acc."DV_U_VERTICAL" As "Vertical",
ter."DV_U_GEO" AS "FIELD_GEO",
ter."DV_U_MAJOR_AREA" AS "FIELD_MAJOR_AREA",
ter."DV_U_AREA" AS "FIELD_AREA",
 MAX("END_DATE") AS "ContractEnd",
 ROW_NUMBER() OVER (PARTITION BY SR."NUMBER" ORDER BY SR."DV_SALES_ACCOUNT" DESC) AS rownum
 from  "SURF_RT"."SALES_ACCOUNT" acc
left join "SURF_RT"."SALES_REQUEST" SR  on  acc."NAME" = SR."DV_SALES_ACCOUNT"
left join "SURF_RT"."SALES_CONTRACT" con on con."DV_ACCOUNT"=SR."DV_SALES_ACCOUNT"
left join "SURF_RT"."U_SALES_TERRITORY" ter on acc."DV_U_ACCOUNT_TERRITORY" = ter."U_NAME"
JOIN "SURF_RT"."U_SALES_REQUEST_ALERT_LINES" line on sr."NUMBER"=line."DV_U_SALES_REQUEST"
JOIN "SURF_RT"."SALES_PRODUCT" prod on line."U_PRODUCT_CODE"=prod."U_PRODUCT_CODE"
WHERE 
"DV_SALES_CATEGORY"='Compliance' AND SR."DV_STATE"  NOT IN ('Closed Canceled')
AND YEAR("U_ANALYZED_DATE") = '2020' AND MONTH("U_ANALYZED_DATE") IN ('1','2','3','4')
AND acc."DV_TYPE" NOT IN ('Suspect','Prospect','Inactive','Inactive-Former Customer','Vendor')
GROUP BY SR."NUMBER" ,
SR."U_ANALYZED_DATE",
SR."DV_SALES_ACCOUNT",
"U_USD_TOTAL_POTENTIAL_NNACV",
"U_USD_TOTAL_UNDEPLOYED_BACKLOG",
"U_USD_TOTAL_UNDER_SUBSCRIBED",
"DV_U_BUSINESS_UNIT",
"CUSTOMER_SINCE",
acc."U_NEW_SEGMENT",
acc."DV_INDUSTRY",
acc."DV_U_ACCOUNT_TERRITORY",   
acc."DV_U_VERTICAL",
ter."DV_U_GEO" ,
ter."DV_U_MAJOR_AREA" ,
ter."DV_U_AREA"
ORDER BY SR."DV_SALES_ACCOUNT","SRNUM",
"SRAnalyzeddate"
)

我希望单个DV_SALES_ACCOUNT的每个SRNUM具有不同的行号,如下所示:

SRNUM1 = rownum1
SRNUM1 = rownum1
SRNUM1 = rownum1
SRNUM2 = rownum2
SRNUM2 = rownum2
SRNUM2 = rownum2
SRNUM3 = rownum3
SRNUM3 = rownum3
SRNUM3 = rownum3

相反,我得到这个:

SRNUM1 = rownum1
SRNUM1 = rownum2
SRNUM1 = rownum3
SRNUM2 = rownum1
SRNUM2 = rownum2
SRNUM2 = rownum3
SRNUM3 = rownum1
SRNUM3 = rownum2
SRNUM3 = rownum3

我该如何解决?谢谢!

我在这里输入占位符,因为某些原因,他们认为我的问题是“代码太多”。

sql hana
1个回答
0
投票

您要达到的目标的口头描述与预期的输出不同。实际上,您当前所得到的输出就是您所描述的。

回望您的预期输出

SRNUM1 = rownum1
SRNUM1 = rownum1
SRNUM1 = rownum1
SRNUM2 = rownum2
SRNUM2 = rownum2
SRNUM2 = rownum2
SRNUM3 = rownum3
SRNUM3 = rownum3
SRNUM3 = rownum3

似乎您想为每个SRNUM分配自己的编号(每个帐户)。

有了这种见识,很容易回到您的SQL并实现它:

[...]
ROW_NUMBER() OVER 
 (PARTITION BY 
           SR."DV_SALES_ACCOUNT", SR."NUMBER" 
  ) AS "ACCOUNT_SALES_REQUEST_NUMBER"
[...]

您要谨慎选择别名。 ROWNUM是SQL中已经使用的术语,它将数据库技术问题与应用程序领域问题混合在一起。

作为示例,我在这里使用了"ACCOUNT_SALES_REQUEST_NUMBER",虽然键入时间很长,但至少在锡纸上写着它是什么。

© www.soinside.com 2019 - 2024. All rights reserved.