Sql 查询只追加表;不同的内部连接问题

Sql 查询只追加表;不同的内部连接问题,sql,database,google-bigquery,stitch,Sql,Database,Google Bigquery,Stitch,我有下面的SQL,它试图获取结果表中每一行的最新版本,即具有唯一确认号、max seq和max batch的单行,这是使用仅附加复制。但是,如果它不返回任何结果,则内部联接会按预期工作,但外部联接不会。预期结果 confirmation_number | date | seq | batch 23742902 | date | max(seq)| max(batch) 这是我要查询的表,我的sql没有返回任何结果集。它应该返回一个单数行,其中包含一个不同的确认

我有下面的SQL,它试图获取结果表中每一行的最新版本,即具有唯一确认号、max seq和max batch的单行,这是使用仅附加复制。但是,如果它不返回任何结果,则内部联接会按预期工作,但外部联接不会。预期结果

confirmation_number |  date | seq     | batch
23742902            |  date | max(seq)| max(batch)
这是我要查询的表,我的sql没有返回任何结果集。它应该返回一个单数行,其中包含一个不同的确认号、max seq和max batch


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

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;

查询的逻辑只是为每个确认号/日期组引入最大值
\u sdc\u sequence
\u batched\u at
值,以及表中已有的列。

如果要保留原始表中的每一行,请在联接的左侧,然后,您应该从联接条件中删除对max的限制:

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;

查询的逻辑只是为每个确认号/日期组引入最大的
\u sdc\u序列
\u sdc\u批处理
值,以及表中已有的列。

下面是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值以及所有相应的值(日期、批次等)


不确定是否还需要按
日期进行分组(正如在您的问题中的查询中一样-但在我看来它不是必需的)-但如果确实需要-很容易添加下面是针对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值以及所有相应的值(日期、批次等)


不确定您是否还需要按
日期进行分组(正如您问题中的查询所示-但在我看来,这是不需要的)-但如果您确实需要-添加很容易,您只能使用一个max seq或batch,如果您同时使用这两个,则无法获取记录,因为可能两个max值都是从不同行返回的,所以。。。可以用像

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


您只能使用一个max seq或batch then u get result,如果同时使用两个max seq或batch,则无法获取记录,因为可能两个max值都是从不同行返回的,所以。。。可以用像

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


你是说你没有得到结果,或者你确实得到了结果,但它们不是你所期望的?@TimBiegeleisen我没有得到任何结果,因为这些行应该返回一个包含唯一确认号、最大顺序和最大批次的单数记录。@Squirtle-你的比率很低。重要提示-您可以使用投递答案左侧投票下方的勾号
标记接受答案
。看看为什么它很重要!对答案进行投票也很重要。投票选出有帮助的答案。。。当有人回答你的问题时,你可以检查一下该做什么。遵循这些简单的规则,你可以提高自己的声望得分,同时让我们有动力去回答你的问题。你是说你没有得到结果,或者你确实得到了结果,但它们不是你所期望的?@TimBiegeleisen我没有得到任何结果,因为这些行应该返回一个包含唯一确认号、最大顺序和最大批次的单数记录。@Squirtle-你的比率很低。重要提示-您可以使用投递答案左侧投票下方的勾号
标记接受答案
。看看为什么它很重要!对答案进行投票也很重要。投票选出有帮助的答案。。。当有人回答你的问题时,你可以检查一下该做什么。遵循这些简单的规则,你可以提高自己的声望得分,同时让我们有动力去回答你的问题。我已经更新了我的示例表以获得更清晰的解释。坏消息是:它不再清晰了。但是如果你能对我的答案发表评论,我们至少可以确认/排除对你的问题的一种可能的解释。我已经更新了我的示例表,以获得更清晰的解释。坏消息:它一点也不清晰。但如果你能对我的答案发表评论,我们至少可以确认/排除对你的问题的一种可能解释。根据你最近的编辑-看起来我上面的答案正是你想要的。我看到的唯一问题是不同记录中是否有max seq和max batch,我如何只返回一行?@Squirtle——这更简单——但是
date
字段的逻辑是什么?日期值应该来自哪里?请澄清您最近的编辑-看起来我上面的答案正是您想要的。我看到的唯一问题是,如果不同的记录中有max seq和max batch,我如何只返回一行?@Squirtle-这更简单-但是
日期
字段的逻辑是什么?日期值应该来自哪里?请澄清