oracle sql — отфильтровывать повторяющиеся записи при условии

#sql #database #oracle #group-by #analytic-functions

#sql #База данных #Oracle #группировать по #аналитические функции

Вопрос:

У меня есть следующий запрос для получения sale_price по дате:

 SELECT 
product_name, 
SUM(sale_price) top_sale_price, 
sale_date,
COUNT(*) count
FROM sales
WHERE sale_date IN
    (TO_DATE ('14-JUN-14', 'DD-MON-YY'),
    TO_DATE ('14-JUN-14', 'DD-MON-YY') - 1,
    TO_DATE ('14-JUN-14', 'DD-MON-YY') - 7,
    TO_DATE ('14-JUN-14', 'DD-MON-YY') - 2 * 7,
    TO_DATE ('14-JUN-14', 'DD-MON-YY') - 3 * 7,
    TO_DATE ('14-JUN-14', 'DD-MON-YY') - 4 * 7,
    TO_DATE ('14-JUN-14', 'DD-MON-YY') - 5 * 7,
    TO_DATE ('14-JUN-14', 'DD-MON-YY') - 6 * 7,
    TO_DATE ('14-JUN-14', 'DD-MON-YY') - 7 * 7,
    TO_DATE ('14-JUN-14', 'DD-MON-YY') - 8 * 7,
    TO_DATE ('14-JUN-14', 'DD-MON-YY') - 9 * 7,
    TO_DATE ('14-JUN-14', 'DD-MON-YY') - 10 * 7)
GROUP BY 
product_name, 
sale_date
  

Мои результаты выглядят примерно так:

 product_name     top_sale_price     sale_date     count
shoes            10.00              01-JUL-14     2
hat              11.00              30-JUN-14     1
shirt            12.00              24-JUN-14     3
...
  

Я хочу выбрать только одну рубашку или шляпу из каждой группы, основываясь на некоторой логике. Например, скажем, что существует строка ‘is_valid_purchase’. Если в группировке есть один или несколько элементов, например, в ‘shoes’ и ‘shirt’, я хочу выбрать элемент, для ‘is_valid_purchase’ которого установлено значение true (обратите внимание, что в этом примере только для одного из элементов в group by будет установлено значение ‘is_valid_purchase’ true). Как я мог бы изменить свой sql, чтобы делать то, что я описал?

Комментарии:

1. После агрегирования вы больше не имеете дело с исходными отдельными строками. Итак, чего вы действительно хотите? Вы хотите исключить недопустимые покупки из SUM и COUNT ?

2. да, я хочу исключить из ‘SUM’ и ‘COUNT’ на основе условия.

3. Затем просто включите это в свое WHERE предложение: sale_date IN ... AND is_valid_purchase .

Ответ №1:

Это то, чего вы хотите?

 with t as (
      SELECT product_name, SUM(sale_price) top_sale_price, sale_date, COUNT(*) count
      FROM sales
      WHERE sale_date IN
          (TO_DATE ('14-JUN-14', 'DD-MON-YY'),
          TO_DATE ('14-JUN-14', 'DD-MON-YY') - 1,
          TO_DATE ('14-JUN-14', 'DD-MON-YY') - 7,
          TO_DATE ('14-JUN-14', 'DD-MON-YY') - 2 * 7,
          TO_DATE ('14-JUN-14', 'DD-MON-YY') - 3 * 7,
          TO_DATE ('14-JUN-14', 'DD-MON-YY') - 4 * 7,
          TO_DATE ('14-JUN-14', 'DD-MON-YY') - 5 * 7,
          TO_DATE ('14-JUN-14', 'DD-MON-YY') - 6 * 7,
          TO_DATE ('14-JUN-14', 'DD-MON-YY') - 7 * 7,
          TO_DATE ('14-JUN-14', 'DD-MON-YY') - 8 * 7,
          TO_DATE ('14-JUN-14', 'DD-MON-YY') - 9 * 7,
          TO_DATE ('14-JUN-14', 'DD-MON-YY') - 10 * 7) and
         is_valid_purchase = 1
      GROUP BY product_name, sale_date
     )
select *
from t;
  

Комментарии:

1. Странный синтаксис с предложением double WHERE .