Redshift - оператор Case возвращает дубликаты - PullRequest
0 голосов
/ 04 июля 2018

У меня есть набор данных, который содержит название продукта, номер заказа и время размещения заказа.

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 возвращает дубликаты, полагайте, что он также учитывает каждый sale_id в таблице продаж. Как я мог изменить вышеупомянутый запрос, чтобы получить только одну запись для prod_name. Однако, если я уберу заявление с делом, дубликатов там не будет. Может ли кто-нибудь помочь в том, что я делаю неправильно, что вытягивает эти дубликаты.

Я использую Amazon Redshift DB.

Спасибо ..

1 Ответ

0 голосов
/ 04 июля 2018

Никогда не используйте запятые в предложении 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;

Обратите внимание, что я также добавил в разумные псевдонимы таблиц (сокращения для имен таблиц) и квалифицированные все ссылки на столбцы.

...