Как создать разделенную запятыми строку последних пяти уникальных покупок клиентом в BigQuery SQL? - PullRequest
0 голосов
/ 29 октября 2019

В BigQuery мне нужно заполнить поле строкой, содержащей последние пять уникальных продуктов, купленных клиентом. Ранее я использовал функцию STRING_AGG, но не как упорядочивание, так и различие, и именно здесь у меня возникает проблема. Поэтому я пытаюсь следующее (что работает, если DISTINCT удалено):

SELECT  ps.customerID, STRING_AGG( DISTINCT ps.productId ORDER BY ps.orderDate DESC LIMIT 5 ) AS lastFiveProducts
FROM view.purchases  AS ps
WHERE ps.market = 'SE'
GROUP BY ps.customerID
limit 100

Где бы я хотел, чтобы STRING_AGG приводил к строке типа: "23423,63764,62345,00787, 91228 "

Bigquery выдает ошибку:

" Агрегатная функция, имеющая аргументы DISTINCT и ORDER BY, может только выражения ORDER BY, являющиеся аргументами функции в [1:67] "

, поэтому их нельзя объединить.

Какими еще способами можно построить поле такого типа? Подзапрос?

1 Ответ

1 голос
/ 29 октября 2019

Использование distinct в подзапросе - использование group by:

SELECT ps.customerID,
       STRING_AGG(ps.productId ORDER BY ps.last_orderDate DESC LIMIT 5 ) AS lastFiveProducts
FROM (SELECT ps.customerID, ps.productId, MAX(ps.orderDate) as last_orderDate
      FROM view.purchases ps
      WHERE ps.market = 'SE'
      GROUP BY ps.customerID
     ) ps
GROUP BY ps.customerID;

На самом деле, я бы использовал оконные функции и поместил бы ограничивающую логику в предложение WHERE:

SELECT ps.customerID,
       STRING_AGG(ps.productId ORDER BY ps.last_orderDate DESC) AS lastFiveProducts
FROM (SELECT ps.customerID, ps.productId, MAX(ps.orderDate) as last_orderDate,
             ROW_NUMBER() OVER (PARTITION BY ps.customerID ORDER BY MAX(ps.orderDate)) as seqnum
      FROM view.purchases ps
      WHERE ps.market = 'SE'
      GROUP BY ps.customerID
     ) ps
WHERE seqnum <= 5
GROUP BY ps.customerID;

По общему признанию, это смещение, потому что другие базы данных не поддерживают LIMIT в функциях агрегирования строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...