【发布时间】:2021-05-11 13:12:18
【问题描述】:
您好,我在 Snowflake 中的选择中调用选择查询。我面临的错误是 INVALID IDENTIFIER AS ROWNUM,当我评论 Rownum 时,我面临的错误是 Unsupported Subquery type cant evaluted。
我的要求是将现有的 oracle 查询转换为 SNowflake。
SELECT DISTINCT cust.Id AS Customer_Id
,nvl((
SELECT *
FROM (
SELECT to_char(cliterm.Quantity)
FROM ContractLineItemTerm cliterm
WHERE cliterm.ContractLineItem_id = cli.Id
AND (
cliterm.EndDate IS NULL
OR cliterm.EndDate > add_months(sysdate, - 3)
)
AND cliterm.PriceRuleItem_id IS NULL
ORDER BY cli.id DESC
)
WHERE rownum = 1
), cli.Quantity) AS Quantity_Purchased
,nvl((
SELECT *
FROM (
SELECT cliterm.UsedQuantity
FROM ContractLineItemTerm cliterm
WHERE cliterm.ContractLineItem_id = cli.Id
AND (
cliterm.EndDate IS NULL
OR cliterm.EndDate > add_months(sysdate, - 3)
)
AND cliterm.PriceRuleItem_id IS NULL
ORDER BY cli.id DESC
)
WHERE rownum = 1
), cli.UsedQuantity) AS Quantity_Used_To_Date
,nvl((
SELECT *
FROM (
SELECT cliterm.StartDate
FROM ContractLineItemTerm cliterm
WHERE cliterm.ContractLineItem_id = cli.Id
AND (
cliterm.EndDate IS NULL
OR cliterm.EndDate > add_months(sysdate, - 3)
)
AND cliterm.PriceRuleItem_id IS NULL
ORDER BY cli.id DESC
)
WHERE rownum = 1
), cli.StartDate) AS sbscription_Term_Start_Date
,nvl((
SELECT *
FROM (
SELECT cliterm.EndDate
FROM ContractLineItemTerm cliterm
WHERE cliterm.ContractLineItem_id = cli.Id
AND (
cliterm.EndDate IS NULL
OR cliterm.EndDate > add_months(sysdate, - 3)
)
AND cliterm.PriceRuleItem_id IS NULL
ORDER BY id DESC
)
WHERE rownum = 1
), cli.EndDate) AS sbscription_Term_End_Date
,nvl(to_char(cli.EndDate), (
CASE
WHEN (
cli.StartDate IS NOT NULL
AND con.InitialTerm > 0
)
THEN 'Auto Renewal'
ELSE ''
END
)) AS Contr_End_Date
FROM ContractLineItem cli
INNER JOIN Contract con ON cli.Contract_id = con.Id
INNER JOIN Customer cust ON con.Customer_id = cust.Id
INNER JOIN Organization org ON org.Customer_id = cust.Id
INNER JOIN Product prod ON cli.Product_id = prod.Id
INNER JOIN Producttype pt ON prod.ProductBrand_id = pt.Id
LEFT JOIN account acc ON cust.SAN = acc.acc__c
LEFT JOIN account acc1 ON acc.parentid = acc1.id
LEFT JOIN sbSCRIPTION sb ON sb.id = cli.sforceid
LEFT JOIN sbSCRIPTION pasb ON pasb.id = sb.srequired
LEFT JOIN scontract1 cntr ON cntr.contractnumber = con.ContNumber
LEFT JOIN user accowner ON acc.ownerid = accowner.id
LEFT JOIN user accsalesmanager ON accowner.managerid = accsalesmanager.id
LEFT JOIN (
SELECT f.accountid
,g.managerid
,max(g.NAME) CSM
,max(g.id) CSMID
FROM accountteammember f
JOIN user g ON f.userid = g.id
WHERE f.teammemberrole = 'AGM'
GROUP BY f.accountid
,g.managerid
) acccsm ON acccsm.accountid = acc.id
LEFT JOIN product2 prd ON prod.Code = prd.productcode
LEFT JOIN prdfam prod_fam ON prod_fam.product_family_desc = prd.Product_Family__c
)
WHERE Quantity_Purchased <> 0
);
如何将其转换为支持的雪花,因为它应该根据rownum = 1选择数量列,如果它为null,则应该用一些x替换。
【问题讨论】:
-
请编辑您的问题以包含完整的 SQL 语句;您不需要提供 SELECT 中的所有列,但您需要包含所有表及其连接逻辑
-
我提到了完整的 oracle sql 查询,现在需要根据 Snowflake 进行更改。请提出更改建议。
-
嗨 - 您的每个子选择中的 ORDER BY cli.id 不会做任何事情,因为 SELECT 无论如何都仅限于单个 id(来自连接)。如果这些子选择返回多个记录,那么您将获得随机选择 - 我认为这不是您想要的。对于每个 cli.id,如果有多个,确定从每个子选择返回哪个记录的正确逻辑是什么?
标签: snowflake-cloud-data-platform