繁体   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