基于另一个表的计数的表中的红移样本

Posted

技术标签:

【中文标题】基于另一个表的计数的表中的红移样本【英文标题】:Redshift sample from table based on count of another table 【发布时间】:2020-06-30 15:41:44 【问题描述】:

我的 TableA 有 3000 行(可以是任何小于 10000 的数字)。我需要创建 10000 行的 TableX。所以我需要从 TableB 中选择随机 10000 - (TableA 中的行数)(并添加到 TableA 中)来创建 TableX。请问有什么想法吗? 像这样的东西(显然行不通):

Create table TableX as
select * from TableA
union
select * from TableB limit (10000 - count(*) from TableA);

【问题讨论】:

select * from tablex limit 10000? TableX 不存在。 TableB 有数百万行。我需要一个来自 TableB 的随机样本。该样本的数量基于 TableA 中的行数。然后将 TableA 和 TableB 中的随机选择组合成新表 TableX 如果你不使用order by limit 有点随机 【参考方案1】:

您可以使用union all 和窗口函数。你没有列出表格列,所以我假设col1col2

insert into tableX (col1, col2)
select col1, col2 from table1
union all 
select t2.col1, t2.col2
from (select t2.*, row_number() over(order by random()) from table2 t2) t2
inner join (select count(*) cnt from table1) t1 on t2.rn <= 10000 - t1.cnt

union all 中的第一个查询选择 table1 中的所有行。第二个查询将随机行号分配给table2 中的行,然后根据需要选择尽可能多的行以达到10000 的总数。

实际上从两个表中选择所有行可能更简单,然后在外部查询中选择order bylimit

insert into tableX (col1, col2)
select col1, col2
from (
    select col1, col2, 't1' which from table1
    union all 
    select col1, col2, 't2' from table2
) t
order by which, random()
limit 10000

【讨论】:

【参考方案2】:
with inparms as (
  select 10000 as target_rows
), acount as (
  select count(*) as acount, inparms.target_rows 
    from tablea
   cross join inparms
), btag as (
  select b.*, 'tableb' as tabsource, 
         row_number() over (order by random()) as rnum
    from tableb
)
select a.*, 'tablea', row_number() over (order by 1) as rnum
  from tablea
union all
select b.*
  from btag b
  join acount a on b.rnum <= a.target_rows - a.acount
;

【讨论】:

以上是关于基于另一个表的计数的表中的红移样本的主要内容,如果未能解决你的问题,请参考以下文章

SQL:根据另一个表的计数结果更新一个表中的列

如何从 bigquery 中的另一个表中获取短语列表的表字段中的匹配计数?

创建一个用其他表的记录计数填充的表

表中的递增/递减计数值取决于使用 postgresql 中的触发器插入/删除另一个表的特定列值

如何使用计数查询来(自动)更新表中的列

使用亚马逊管道的红移副本因缺少主键而失败