仅追加查询 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
我有以下 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