[英]Return only last statement from Snowflake SQL query to R
我有一个雪花 SQL 查询,我试图通过 ODBC 连接在 R 中执行,如下所示
SET quiet=TRUE;
USE SOMEDATABASE.SOMESCHEMA;
--Select timestamp of last sale per customer
DROP TABLE IF EXISTS sales;
CREATE TEMPORARY TABLE sales(CustomerId VARCHAR(16777216), SaleTS TIMESTAMP_NTZ(9));
INSERT INTO sales
SELECT CustomerId,
SaleTS
FROM SALES
WHERE SaleTS>= '2020-11-19 00:00:00'
AND SaleTS <= '2020-11-19 23:59:59.999'
GROUP BY CustomerId;
--Use temp table to get correct row from sales table
SELECT SUM(SalesDetail.price) as SumPrice
COUNT(*) as SoldVolume
FROM sales
LEFT JOIN SALES as SalesDetail
ON Sales.CustomerId = SalesDetail.CustomerId
AND sales.SaleTS = SalesDetail.SaleTS
从 R 查询 Microsoft SQL Server 我通常包括set nocount no;
在查询的顶部确保只将最后一步返回给 R 以避免错误Actual statement count 6 did not match the desired statement count 1.
错误是有道理的,当 R 期望为 1(6 一对于我的 SQL 查询中的每一步)。 在 Snowflake 中,似乎没有以相同方式设置 nocount 的选项。 我的问题是如何避免上述错误。 有没有人有通过 R 执行多步 Snowflake SQL 查询的经验? 如何让 R 只接收来自 ODBC 连接的最后一条语句。 到目前为止,我已经尝试过set nocount=TRUE;
, set echo=FALSE;
, set message=FALSE;
, SET quiet=TRUE
等
Snowflake SQL 具有足够的表达能力,建议的代码可以构造为单个查询:
WITH cte AS (
SELECT CustomerId, MAX(SaleTS) AS SaleTS -- here agg function is required
FROM SALES
WHERE SaleTS>= '2020-11-19 00:00:00'
AND SaleTS <= '2020-11-19 23:59:59.999'
GROUP BY CustomerId
)
SELECT SUM(SalesDetail.price) as SumPrice
COUNT(*) as SoldVolume
FROM cte
LEFT JOIN SALES as SalesDetail
ON Sales.CustomerId = SalesDetail.CustomerId
AND sales.SaleTS = SalesDetail.SaleTS;
原始查询对表和临时表使用相同的名称,仅在 case sales
与SALES
有所不同,这很容易出错。
第二:可以在建立连接时设置数据库和模式,因此不需要在脚本中USE
。 或者,可以在脚本中使用完全限定名称。
我猜查询的意图如下:
WITH cte AS (
SELECT *
FROM SOMEDATABASE.SOMESCHEMA.SALES
WHERE SaleTS BETWEEN '2020-11-19 00:00:00' AND '2020-11-19 23:59:59.999'
QUALIFY ROW_NUMBER() OVER(PARTITION BY CustomerId ORDER BY SaleTS DESC) = 1
)
SELECT COUNT(*) AS SoldVolume, SUM(price) as SumPrice
FROM cte;
如果一个人可能有两个完全相同的 SaleTS 条目,则应改用RANK() OVER(...)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.