Postgres:拉取两组不重叠的数据
Postgres: pull two non-overlapping sets of data
我想从我们的数据存储中随机提取 30K 行以创建一个数据集,然后再提取 30K 行用于第二个数据集,该数据集与第一个数据集不重叠任何 ID。
我的想法是在绘制第二个子查询时以某种方式引用第一个子查询中提取的 id 列,然后 return 它们的并集:
SELECT * FROM (
SELECT id_col, A, B, C, 'group1' as label
FROM my_db
LIMIT 30000
) as t1
UNION ALL
(
SELECT id_col, A, B, C, 'group2' as label
FROM my_db
WHERE id_col NOT IN t1.id_col
LIMIT 30000
) as t2
但这不起作用,因为我收到“t1 处或附近的语法错误”。
已更新:向列添加标签以显示联合如何为两个组创建高格式。
正如 klin 在评论中指出的那样,您需要使用通用 Table 表达式 (CTE) 才能达到您想要的结果:
WITH t1 AS (
SELECT id_col, A, B, C, 'group1' AS label
FROM my_db
LIMIT 30000
), t2 AS (
SELECT id_col, A, B, C, 'group2' AS label
FROM my_db
WHERE id_col NOT IN (SELECT id_col FROM t1)
LIMIT 30000
)
SELECT id_col, A, B, C, label
FROM t1
UNION
SELECT id_col, A, B, C, label
FROM t2
您也不需要执行 UNION ALL,一个 UNION 就足够了。
我想从我们的数据存储中随机提取 30K 行以创建一个数据集,然后再提取 30K 行用于第二个数据集,该数据集与第一个数据集不重叠任何 ID。
我的想法是在绘制第二个子查询时以某种方式引用第一个子查询中提取的 id 列,然后 return 它们的并集:
SELECT * FROM (
SELECT id_col, A, B, C, 'group1' as label
FROM my_db
LIMIT 30000
) as t1
UNION ALL
(
SELECT id_col, A, B, C, 'group2' as label
FROM my_db
WHERE id_col NOT IN t1.id_col
LIMIT 30000
) as t2
但这不起作用,因为我收到“t1 处或附近的语法错误”。
已更新:向列添加标签以显示联合如何为两个组创建高格式。
正如 klin 在评论中指出的那样,您需要使用通用 Table 表达式 (CTE) 才能达到您想要的结果:
WITH t1 AS (
SELECT id_col, A, B, C, 'group1' AS label
FROM my_db
LIMIT 30000
), t2 AS (
SELECT id_col, A, B, C, 'group2' AS label
FROM my_db
WHERE id_col NOT IN (SELECT id_col FROM t1)
LIMIT 30000
)
SELECT id_col, A, B, C, label
FROM t1
UNION
SELECT id_col, A, B, C, label
FROM t2
您也不需要执行 UNION ALL,一个 UNION 就足够了。