Запрос добавляет только таблицу; отдельная проблема внутреннего соединения
У меня есть следующий 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
значения для каждой группы номеров / дат подтверждения, а также столбцы, которые уже есть в вашей таблице.