Исключая строки данных, если 2 строки имеют данные, совпадающие в 2 столбцах - PullRequest
1 голос
/ 05 октября 2019

Настройка: данные хранятся в hadoop, а запросы - в Impala.

Я пытаюсь создать запрос, который позволяет мне получить информацию о доставке, которую мы видим от наших клиентов (их доставка осуществляетсяколичество всех строк, которые мы видели в нашей базе данных, за данный период. Чтобы сделать это, мне нужно исключить, где мы дважды посчитали строку, поэтому вместо подсчета 2+ строк мы просто считаем1.

Двойной счет в этом случае - это когда 2 столбца имеют одинаковые данные строки.

Пример: в таблице ниже я должен иметь возможность выполнить запрос, поэтому я удаляю строку1 из моего подсчета "C4", так как первые 2 строки имеют совпадающие 2 столбца.

TABLE = table
c1 = string
c2 = bigint

C1    || C2         || C3  || C4
--------------------------
a     || 1          || a   || 1
a     || 1          || a   || 1
a     || 2          || b   || 1
a     || 3          || a   || 1
a     || 4          || b   || 1
b     || 2          || c   || 1
c     || 1          || d   || 1
c     || 2          || d   || 1

Текущий запрос, который возвращает все строки:

SELECT c1,
       c3,
       count(c4) AS 'delivery'
FROM table
WHERE c1 = 'a'
GROUP BY c1, c3

Из того, что я проверил онлайнМне нужно создать подзапрос, чтобы определить эти строки, однако мне не повезло, что я сделал это правильно и вошел в кроличью нору, где я попытался создать новую строку, которая объединяет 2 столбца, как показано ниже:

SELECT
        UNIQUE = c2 + cast(c1 as BIGINT)
FROM table
WHERE month = month(now())

Из этой новой строки я собирался просто просмотреть строки, которые были уникальными, но я уверен, что, вероятно, существует аналогичный способ достижения результата, к которому я стремлюсь.

Из приведенного выше примера таблицыЯ бы хотел увидеть следующие результаты:

c1     c3      delivery
a      a       2
a      b       1

Благодарен за любые рекомендации, которые вы можете предоставить.

1 Ответ

0 голосов
/ 05 октября 2019

Я думаю, вы хотите оконные функции. Для уникальных строк:

SELECT t.*
FROM (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY c1, c2 ORDER BY c1) as seqnum
      FROM t
     ) t
WHERE seqnum = 1;

Для агрегации:

SELECT t.c1, COUNT(*)
FROM (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY c1, c2 ORDER BY c1) as seqnum
      FROM t
     ) t
WHERE seqnum = 1
GROUP BY c1;

Если вы хотите последнее, вы также можете использовать:

SELECT c1, COUNT(DISTINCT c2)
FROM t
GROUP BY c1;
...