Time 雪花不确定查询时间

Time 雪花不确定查询时间,time,snowflake-cloud-data-platform,Time,Snowflake Cloud Data Platform,我想计算与上个月所选数据相比的损耗。 在这种情况下,我想知道从2020-12-01到2021-01-01失去的客户 SELECT DISTINCT("Client Ref"),"Zone","Market Place","Report Period" FROM "REPORT_DB"."PBI"."Revenue" d WHERE "R

我想计算与上个月所选数据相比的损耗。 在这种情况下,我想知道从2020-12-01到2021-01-01失去的客户

SELECT  DISTINCT("Client Ref"),"Zone","Market Place","Report Period"
FROM    "REPORT_DB"."PBI"."Revenue" d
WHERE   "Report Period" ='2020-12-01' AND "Market Place" ='UK' AND "Client Ref" IS NOT NULL 
AND
NOT EXISTS
        (
        SELECT  "Client Ref"
        FROM    "REPORT_DB"."PBI"."Revenue" t
        WHERE   "Report Period" ='2021-01-01' AND "Market Place" ='UK' AND "Client Ref" IS NOT NULL AND d."Client Ref"=t."Client Ref"
        )
这是取回它的正确方法吗


关于。

因此,通过添加带有一些虚拟数据的CTE,并将列名更改为所有列都是安全的

WITH data AS (
    SELECT * FROM VALUES 
    (1,'a','UK','2020-12-01'),
    (1,'a','UK','2021-01-01'),
    (2,'a','UK','2020-12-01'),
    (3,'a','UK','2021-01-01')
    v( Client_Ref, zone, Market_Place, Report_Period)
)
SELECT DISTINCT d.Client_Ref,d.zone,d.Market_Place,d.Report_Period
FROM data AS d
WHERE d.Report_Period ='2020-12-01' AND d.Market_Place ='UK' AND d.Client_Ref IS NOT NULL 
AND
NOT EXISTS
        (
        SELECT  t.Client_Ref
        FROM    data t
        WHERE   t.Report_Period ='2021-01-01' AND t.Market_Place ='UK' AND t.Client_Ref IS NOT NULL AND d.Client_Ref=t.Client_Ref
        );
SQL的基本表单工作并返回:

CLIENT_REF  ZONE    MARKET_PLACE    REPORT_PERIOD
2           a       UK              2020-12-01
这是预期的结果

此查询是一个相关子查询,Snowflake对其支持有限。因此,当这起作用时,当您更改查询时,它可能会运行到
不支持的子查询类型中,无法对其求值
错误,请参阅

通过使用
左连接
,然后使用
其中x为NULL
模式,可以以不相关的形式编写基本查询:

WITH data AS (
    SELECT * FROM VALUES 
    (1,'a','UK','2020-12-01'),
    (1,'a','UK','2021-01-01'),
    (2,'a','UK','2020-12-01'),
    (3,'a','UK','2021-01-01')
    v( Client_Ref, zone, Market_Place, Report_Period)
)
SELECT DISTINCT d.Client_Ref,d.zone,d.Market_Place,d.Report_Period
FROM data AS d
LEFT JOIN data AS t
    ON t.Report_Period ='2021-01-01' AND t.Market_Place ='UK' AND d.Client_Ref=t.Client_Ref
WHERE d.Report_Period ='2020-12-01' AND d.Market_Place ='UK' AND d.Client_Ref IS NOT NULL 
AND t.Client_Ref IS NULL;
如果您的数据源中有许多行不在目标结果范围内,则可以先重写这些行以进行一些筛选,如下所示:

WITH data AS (
    SELECT * FROM VALUES 
    (1,'a','UK','2020-12-01'),
    (1,'a','UK','2021-01-01'),
    (2,'a','UK','2020-12-01'),
    (3,'a','UK','2021-01-01')
    v( Client_Ref, zone, Market_Place, Report_Period)
), wanted_data AS (
    SELECT DISTINCT Client_Ref, zone, Market_Place, Report_Period
    FROM data
    WHERE Report_Period BETWEEN '2020-12-01' AND '2021-01-01'
    AND Market_Place ='UK' AND Client_Ref IS NOT NULL
)
SELECT DISTINCT d.Client_Ref,d.zone,d.Market_Place,d.Report_Period
FROM wanted_data AS d
LEFT JOIN wanted_data AS t
    ON t.Report_Period ='2021-01-01'AND d.Client_Ref=t.Client_Ref
WHERE d.Report_Period ='2020-12-01' 
AND t.Client_Ref IS NULL;

但就我的一生而言,如果我像您一样将列命名为“Client Ref”
,那么我的SQL将无法工作,因此我无法回答这一部分,但这就是您构建SQL的方式。

感谢您的时间和示例Simeon!没问题,这是我们都变得更好的方式。