Запрос добавляет только таблицу; отдельная проблема внутреннего соединения

У меня есть следующий SQL, который пытается захватить последнюю версию каждой строки в таблице результатов, то есть единственную строку, которая имеет уникальный номер подтверждения, max seq и max batch, это использует репликацию только с добавлением (docs). Однако он не возвращает никаких результатов, внутреннее соединение работает, как ожидалось, но не внешнее. Ожидаемый результат

confirmation_number |  date | seq     | batch
23742902            |  date | max(seq)| max(batch)
  SELECT DISTINCT r.*
    FROM `results_table` r
    INNER JOIN (
      SELECT confirmation_number,
      date,
      MAX(_sdc_sequence) AS seq,
      MAX(_sdc_batched_at) AS batch
      FROM `results_table`
      GROUP BY confirmation_number, date) rr
    ON r.confirmation_number = rr.confirmation_number 
    AND r.date = rr.date
    AND r._sdc_sequence = rr.seq
    AND r._sdc_batched_at = rr.batch

Это таблица, к которой я хочу запросить, и мой sql не возвращает набор результатов. Он должен вернуть мне единственную строку, которая содержит отдельный номер подтверждения, максимальную последовательность и максимальный пакет.

3 ответа

Решение

Ниже приведен стандартный SQL BigQuery.

Я вполне догадываюсь о вашем ожидаемом результате, но нижеприведенные взгляды должны дать вам ожидаемый

#standardSQL
SELECT AS VALUE ARRAY_AGG(r ORDER BY seq DESC LIMIT 1)[OFFSET(0)]
FROM `project.dataset.results_table` r
GROUP BY confirmation_number

Как вы можете видеть здесь - он возвращает одну строку на номер подтверждения - строку, которая имеет максимальное значение seq для этого номера подтверждения со всеми соответствующими значениями (дата, пакет и т. Д.)

Не уверен, нужно ли вам также сгруппировать по date (как и в запросе в вашем вопросе - но, на мой взгляд, это не нужно) - но если вам действительно нужно - легко добавить

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

SELECT DISTINCT r.*
    FROM `results_table` r
    INNER JOIN (
      SELECT confirmation_number,
      date,
      MAX(_sdc_sequence) AS seq,
      MAX(_sdc_batched_at) AS batch
      FROM `results_table`
      GROUP BY confirmation_number, date) rr
    ON r.confirmation_number = rr.confirmation_number 
    AND r.date = rr.date
    AND r._sdc_sequence = rr.seq
    ----AND r._sdc_batched_at = rr.batch

ИЛИ

SELECT DISTINCT r.*
    FROM `results_table` r
    INNER JOIN (
      SELECT confirmation_number,
      date,
      MAX(_sdc_sequence) AS seq,
      MAX(_sdc_batched_at) AS batch
      FROM `results_table`
      GROUP BY confirmation_number, date) rr
    ON r.confirmation_number = rr.confirmation_number 
    AND r.date = rr.date
    ----AND r._sdc_sequence = rr.seq
    AND r._sdc_batched_at = rr.batch

Если вы хотите сохранить каждую строку в исходной таблице в левой части соединения, вам следует снять ограничения на максимальное значение из условий соединения:

SELECT r.*, rr.seq, rr.batch
FROM results_table r
INNER JOIN
(
    SELECT confirmation_number, date, MAX(_sdc_sequence) AS seq,
           MAX(_sdc_batched_at) AS batch
    FROM results_table
    GROUP BY confirmation_number, date
) rr
    ON r.confirmation_number = rr.confirmation_number AND
       r.date = rr.date;

Логика запроса - просто внести максимум _sdc_sequence а также _sdc_batched_at значения для каждой группы номеров / дат подтверждения, а также столбцы, которые уже есть в вашей таблице.

Другие вопросы по тегам