簡體   English   中英

僅將 Snowflake SQL 查詢中的最后一條語句返回到 R

[英]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 salesSALES有所不同,這很容易出錯。

第二:可以在建立連接時設置數據庫和模式,因此不需要在腳本中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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM