0

我有以下 SQL 尝试获取结果表中每一行的最新版本,即具有唯一确认编号、最大 seq 和最大批次的单个行,这是使用仅附加复制(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 没有返回任何结果集。它应该返回一个包含不同的确认编号、最大序列和最大批次的单行

在此处输入图像描述

4

3 回答 3

1

以下是 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

正如您在此处看到的 - 每个确认号返回一行 - 具有该确认号的最大 seq 值以及所有相应值(日期、批次等)的行

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

于 2019-12-03T06:17:33.003 回答
1

您只能使用一个最大 seq 或批处理,然后如果您同时使用两者,则无法获取记录,因为可能两个最大值都是从不同行返回的,所以...可以使用...

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
于 2019-12-03T06:30:38.047 回答
0

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

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值,以及表中已经存在的列。

于 2019-12-03T05:54:18.960 回答