Пример запроса на дедупликацию большого запроса - PullRequest
0 голосов
/ 11 декабря 2018

Кто-нибудь может объяснить этот запрос Bigquery для дедупликации?Почему мы должны использовать [OFFSET (0)]?Я думаю, что он используется, чтобы взять первый элемент в массиве агрегации правильно?Разве это не то же самое, что LIMIT 1?Зачем нам нужно агрегировать всю таблицу?Почему мы можем объединить всю таблицу в одну ячейку?

 # take the one name associated with a SKU
    WITH product_query AS (
      SELECT 
      DISTINCT 
      v2ProductName,
      productSKU
      FROM `data-to-insights.ecommerce.all_sessions_raw` 
      WHERE v2ProductName IS NOT NULL 
    )
    SELECT k.* FROM (
    # aggregate the products into an array and 
      # only take 1 result
      SELECT ARRAY_AGG(x LIMIT 1)[OFFSET(0)] k 
      FROM product_query x 
      GROUP BY productSKU # this is the field we want deduplicated
    );

1 Ответ

0 голосов
/ 11 декабря 2018

Давайте начнем с некоторых данных, которые мы хотим дедуплицировать:

WITH table AS (SELECT * FROM UNNEST([STRUCT('001' AS id, 1 AS a, 2 AS b), ('002', 3,5), ('001', 1, 4)]))

SELECT *
FROM table t

enter image description here

Теперь вместо * ясобирается использовать t для ссылки на всю строку:

SELECT t
FROM table t

enter image description here

Что произойдет, если я сгруппирую каждую из этих строк по их идентификатору:

SELECT t.id, ARRAY_AGG(t) tt
FROM table t
GROUP BY 1

enter image description here

Теперь у меня есть все строки с одинаковым идентификатором, сгруппированные вместе.Но позвольте мне выбрать только один:

SELECT t.id, ARRAY_AGG(t LIMIT 1) tt
FROM table t
GROUP BY 1

enter image description here

Это может выглядеть хорошо, но это все еще одна строка в одном массиве.Как мне получить только строку, а не массив:

SELECT t.id, ARRAY_AGG(t LIMIT 1)[OFFSET(0)] tt
FROM table t
GROUP BY 1

enter image description here

И если я хочу вернуть строку без группировки id, ни префикс tt:

SELECT tt.*
FROM (
  SELECT t.id, ARRAY_AGG(t LIMIT 1)[OFFSET(0)] tt
  FROM table t
  GROUP BY 1
)

enter image description here

И вот как вы дублируете строки на основе идентификаторов строк.

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