在 Redshift 中获取缺少 id 的行

Posted

技术标签:

【中文标题】在 Redshift 中获取缺少 id 的行【英文标题】:Get rows with missing id in Redshift 【发布时间】:2016-12-15 13:51:28 【问题描述】:

我有类似的东西

id | name
---|-----
1  | Sarah
3  | Pat
4  | Lea

我正在寻找缺失的行。我尝试使用 generate_series 和左连接,但这是您在 Redshift 中无法执行的操作,因为不支持 generate_series

没有临时表可以吗?

编辑

终于with a temporary table (0 to 1_000_000) 看到答案了。

【问题讨论】:

您需要临时表或子查询。因为你需要一些东西来告诉你什么是全套,知道缺少什么。所以答案是NO 这可能对***.com/questions/17282276/…有帮助 你怎么知道哪一行是“缺失”的? @a_horse_with_no_name 系列中的 ID 缺失。 你为什么在乎?生成的 ID 不应该是无间隙的(尤其是如果它们是由序列生成的)。 【参考方案1】:

这可能不是最优的。但我就是这样做的

-- create temporary table
CREATE TABLE series (id INT) SORTKEY(id);

-- insert 0 to 1_000_000
INSERT INTO series WITH seq_0_9 AS
(SELECT 0 AS num
UNION ALL SELECT 1 AS num
UNION ALL SELECT 2 AS num
UNION ALL SELECT 3 AS num
UNION ALL SELECT 4 AS num
UNION ALL SELECT 5 AS num
UNION ALL SELECT 6 AS num
UNION ALL SELECT 7 AS num
UNION ALL SELECT 8 AS num
UNION ALL SELECT 9 AS num),
                    seq_0_999 AS
(SELECT a.num + b.num * 10 + c.num * 100 AS num
FROM seq_0_9 a,
    seq_0_9 b,
    seq_0_9 c)
SELECT a.num + b.num * 1000 AS num
FROM seq_0_999 a,
 seq_0_999 b
ORDER BY num;

-- Why not
VACUUM series;

-- LEFT OUTER JOIN with table inverted and with the interval
SELECT *
FROM series
LEFT OUTER JOIN other_table ON series.id = other_table.id
WHERE series.id BETWEEN 0 AND 4
ORDER BY series.id;

【讨论】:

以上是关于在 Redshift 中获取缺少 id 的行的主要内容,如果未能解决你的问题,请参考以下文章

Redshift 获取具有最高优先级和时间戳的行

Redshift SVV_TABLE_INFO 中缺少的表 id 应该存在,查看 STL_QUERY 和 STL_SCAN

Amazon Redshift:获取最新的行查询

使用 Amazon Redshift 从 Python psycopg2 中的游标获取大于 MAX INT 的行数

查找具有已定义结束的连续相同值的行组 (SQL Redshift)

Redshift 创建列表并用它搜索不同的表