В mysql / SparkSQL у нас есть функция first
.который не существует в Redshift.
Я должен изменить код
SELECT
product_id,
first(product_code) as product_code,
first(product_name) as product_name,
first(time_date) as time_date,
max(price_max) as price_max,
min(price_min) as price_min,
sum(count_of_sales) as count_of_sales,
SUM(CASE WHEN time_date = 1538323200000 THEN cost_of_stock_start ELSE 0 END) as cost_of_stock_start,
from storeproductincomelogs
WHERE time_date>= 1538323200000
AND time_date<= 1541001600000
group by product_id;
на
SELECT
product_id,
product_code,
product_name,
min(time_date) as time_date, # have to change first to min, this column can't group by
max(price_max) as price_max,
min(price_min) as price_min,
sum(count_of_sales) as count_of_sales,
SUM(CASE WHEN time_date = 1538323200000 THEN cost_of_stock_start ELSE 0 END) as cost_of_stock_start,
from storeproductincomelogs
WHERE time_date>= 1538323200000
AND time_date<= 1541001600000
group by product_id,product_code,product_name;
Без first
, я должен добавить product_code,product_name
в группе по классам.Или получит ошибку:
Недопустимая операция: столбец «storeproductincomelogs.product_code» должен присутствовать в предложении GROUP BY или использоваться в статистической функции;
Примечание: здесьproduct_id,product_code
уникальны в каждой строке, и дубликат product_name
также вряд ли найден (но может появиться в будущем, поэтому я думаю, что я не могу использовать group by).
Я искал mysql first
эквивалентно в postgresql и получено Выбрать первую строку в каждой группе GROUP BY? .
Сначала я попробовал Distinct on
предложение , которое не поддерживается в Redshift.
Затем я попытался:
WITH summary AS (
SELECT product_id,
product_code,
product_name,
min(time_date) as time_date,
max(price_max) as price_max,
sum(count_of_sales) as count_of_sales,
SUM(CASE WHEN time_date = 1538323200000 THEN cost_of_stock_start ELSE 0 END) as cost_of_stock_start,
ROW_NUMBER() OVER(PARTITION BY product_id ) AS rk
FROM storeproductincomelogs)
SELECT *
FROM summary
WHERE rk = 1;
получил ошибку
[42803] [500310] Amazon Недопустимая операция: столбец «storeproductincomelogs.product_id» должен появиться впредложение GROUP BY или использование в агрегатной функции;
Я не знаю, как написать правильную, поэтому не могу проверить производительность.
Как я могу сделать это в Redshift?