仅追加查询 table;不同的内部连接问题

Query append only table; distinct inner join issue

我有以下 SQL 试图获取结果 table 中每一行的最新版本,即具有唯一 confirmation_number 的单个行,最大序列和最大批次,这是使用仅附加复制 (docs)。然而,它是错误的 returning 没有结果,内部连接按预期工作但不是外部连接。预期结果

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

这是我要查询的 table,而我的 sql return 没有结果集。它应该 return 我是一个单独的行,其中包含一个不同的 confirmation_number、最大序列和最大批次

如果要保留联接左侧原始table中的每一行,则应从联接条件中删除对最大值的限制:

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;

查询的逻辑只是为每个确认 number/date 组引入最大 _sdc_sequence_sdc_batched_at 值,以及您的 table.

以下适用于 BigQuery 标准 SQL

我在这里猜测你的预期结果 - 但在我看来下面应该给你预期的结果

#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

正如您在此处看到的那样 - 它 returns 每个 confirmation_number 一行 - 具有最大 seq 值的行 confirmation_number 具有所有相应的值(日期、批次等) .)

不确定您是否还需要按 date 分组(因为它在您问题的查询中 - 但在我看来不需要) - 但如果您确实需要 - 很容易添加

您只能使用一个最大序列或批次,然后您会得到结果,如果您同时使用两者,则无法获得记录,因为可能两个最大值都是来自不同行的 return,所以...可以使用类似...

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