#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
.