[英]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.