амазонка-красное смещение: выберите идентификатор, первую (а), сумму (б) группы по идентификатору - PullRequest
0 голосов
/ 21 января 2019

В 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?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Как я понимаю, вы не хотите группировать по product_code и product_name, потому что существует небольшая вероятность того, что они не всегда одинаковы для данного идентификатора продукта.

Итак, тогда я бы предложил взять min (или max) из этих двух полей также:

SELECT
  product_id,
  min(product_code) as product_code,
  min(product_name) as product_name,
  min(time_date) as time_date,
  max(price_max) as price_max,
  ... ...
group by product_id;
0 голосов
/ 21 января 2019

Вы можете попробовать ниже - вам нужно добавить ROW_NUMBER() OVER(PARTITION BY product_id order by price_max desc), что даст вам максимальную цену продукта

WITH summary AS (
    SELECT product_id,
           product_code,
           product_name,
           price_max,
           ROW_NUMBER() OVER(PARTITION BY product_id order by price_max desc) AS rk
      FROM  storeproductincomelogs)
SELECT *
  FROM summary
 WHERE rk = 1;
...