Sql 如何在日期中定义过滤器?

Sql 如何在日期中定义过滤器?,sql,amazon-athena,Sql,Amazon Athena,对于查询,我基本上希望比较不同时间段的平均点击量,并根据平均点击量设置一个过滤器 下面的查询为我们提供了2020年1月每家店铺的平均点击率。但我希望看到2020年1月的平均点击量高于0 问题1:在查询中添加where avg_clicks>0时,出现以下错误:“avg_clicks”列无法解析。过滤器放在哪里 SELECT AVG(a.clicks) AS avg_clicks, a.shop_id, b.shop_name FROM (SELEC

对于查询,我基本上希望比较不同时间段的平均点击量,并根据平均点击量设置一个过滤器

下面的查询为我们提供了2020年1月每家店铺的平均点击率。但我希望看到2020年1月的平均点击量高于0

问题1:在查询中添加where avg_clicks>0时,出现以下错误:“avg_clicks”列无法解析。过滤器放在哪里

SELECT AVG(a.clicks) AS avg_clicks,
         a.shop_id, 
         b.shop_name
FROM 
    (SELECT SUM(clicks_on) AS clicks,
         shop_id,
         date
    FROM X
    WHERE site = ‘com’
            AND date >= CAST('2020-01-01' AS date)
            AND date <= CAST('2020-01-31' AS date)
    GROUP BY  shop_id, date) as a
    JOIN Y as b
    ON a.shop_id = b.shop_id
GROUP BY  a.shop_id, b.shop_name
问题2:正如我写的,我想比较两个不同的时间。现在,我想看到2020年2月的平均点击率为0

因此,所需的输出将向我显示1月份点击次数超过0次,但2月份点击次数为0次的商店列表

希望我能解释我的问题。提前谢谢

对于你的问题1,试着使用having子句。阅读SQL语句的顺序,它可以让您更好地了解为什么会出现平均点击错误


从条件聚合开始:

SELECT shop_id, 
       SUM(CASE WHEN DATE_TRUNC('month', date) = '2020-01-01' THEN clicks_on END)  / COUNT(DISTINCT date) as avg_clicks_jan,
       SUM(CASE WHEN DATE_TRUNC('month', date) = '2020-02-01' THEN clicks_on END)  / COUNT(DISTINCT date) as avg_clicks_feb
FROM X
WHERE site = 'com' AND
      date >= '2020-01-01' AND
      date < '2020-03-01'
GROUP BY shop_id;

我不知道你想做什么比较。但是,如果要基于聚合值进行筛选,请使用HAVING子句。

这是一个总和吗。。。“过滤器在哪里…”由AWS athena支持?我在presto文档中找不到这种语法的文档,我是不是遗漏了什么?在查询中::date做了什么?我在那里得到了不匹配的输入@戈登Linoff@zineda . . . 我以为这个问题被贴上了博士后的标签。我删除了Postgres的特定语法。我真的不知道为什么,但它没有给出正确的值。:/我正在努力寻找原因。
SELECT
    shop_id,
    b.shop_name,
    jan_avg_clicks,
    feb_avg_clicks
FROM
(
    SELECT 
        AVG(clicks) AS jan_avg_clicks,
        shop_id
    FROM 
        (
            SELECT 
                SUM(clicks_on) AS clicks,
                shop_id,
                date
            FROM X
            WHERE site = ‘com’
                AND date >= '2020-01-01'
                AND date <= '2020-01-31'
            GROUP BY 
                shop_id, 
                date
        ) as a
    GROUP BY   
        shop_id
    HAVING AVG(clicks) > 0
) jan

join

(
    SELECT 
        AVG(clicks) AS feb_avg_clicks,
        shop_id
    FROM 
        (
            SELECT 
                SUM(clicks_on) AS clicks,
                shop_id,
                date
            FROM X
            WHERE site = ‘com’
                AND date >= '2020-02-01'
                AND date < '2020-03-01'
            GROUP BY 
                shop_id, 
                date
        ) as a
    GROUP BY   
        shop_id
    HAVING AVG(clicks) = 0
) feb
on jan.shop_id = feb.shop_id

join Y as b
on jan.shop_id =  b.shop_id
SELECT shop_id, 
       SUM(CASE WHEN DATE_TRUNC('month', date) = '2020-01-01' THEN clicks_on END)  / COUNT(DISTINCT date) as avg_clicks_jan,
       SUM(CASE WHEN DATE_TRUNC('month', date) = '2020-02-01' THEN clicks_on END)  / COUNT(DISTINCT date) as avg_clicks_feb
FROM X
WHERE site = 'com' AND
      date >= '2020-01-01' AND
      date < '2020-03-01'
GROUP BY shop_id;