查询仅追加表;明显的内部联接问题

时间:2019-12-03 05:46:01

标签: sql database google-bigquery stitch

我有以下SQL尝试获取结果表中每一行的最新版本,即具有唯一确认号,最大seq和最大批处理的单行,这使用仅附加复制{{3 }}。但是,它不返回任何结果都是错误的,内部联接可以按预期运行,但不能正常运行。预期结果

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没有返回结果集。它应该返回一个单行,其中包含一个不同的confirmation_number,max seq和max batch

(docs)

3 个答案:

答案 0 :(得分: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分组(就像您查询中的查询一样-但在我看来,这不是必需的)-但是,如果您确实需要-很容易添加< / p>

答案 1 :(得分: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

OR

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

答案 2 :(得分: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值,以及表中已经存在的列。