Redshift-Case语句返回重复项

时间:2018-07-04 11:26:08

标签: sql case amazon-redshift

我有一个包含产品名称,订单号和下订单时间的数据集。

prod_name,order_no,order_time
a,101,2018-05-01
a,102,2018-06-04
a,103,2018-05-03
b,104,2018-01-21
b,105,2018-01-11

我正在尝试构建一个报告,该报告显示自一阶订单以来的时间(与当前时间相比),其输出如下:

prod_name,time_since_first_sale,aging
a,64,Less than 3 months back
b,177,Less than 6 months back

以下是我正在使用的SQL:

select DISTINCT b.prod_name,case when((CURRENT_TIMESTAMP - min(a.order_time))) < '90'  THEN 'Less than 3 months'
                               when ((CURRENT_TIMESTAMP - min(order_time))) < '180'  THEN 'Less than 6 months' 
                               else 'Other' end as aging
                               from sales a, prod b where a.id=b.prod_id;

上面的SQL在执行时返回重复项,相信它还会考虑sales表中的每个sale_id。我如何修改上面的查询,以便每个prod_name仅获得一条记录。但是,如果我删除案例声明,则重复项不存在。关于我在做错什么的任何人都可以提供帮助,以获取这些副本。

我正在使用Amazon Redshift DB。

谢谢..

1 个答案:

答案 0 :(得分:1)

从不FROM子句中使用逗号。 总是使用正确的,明确的,标准 JOIN语法。

打算使用SELECT DISTINCT时不要使用GROUP BY

因此您的查询应如下所示:

select p.prod_name,
       (case when CURRENT_TIMESTAMP - min(s.order_time) < '90'  
             then 'Less than 3 months'
             when CURRENT_TIMESTAMP - min(s.order_time) < '180' then 'Less than 6 months' 
             else 'Other'
        end) as aging
from sales s join
     prod p
     on s.id = p.prod_id
group by p.prod_name;

请注意,我还添加了合理的表别名(表名称的缩写)和合格的 all 列引用。