选择随机行,使得子组列的组合是唯一的

问题描述 投票:0回答:2

my_table
与列
a
b
c
d
e
我想随机选择
N
行,这样列
a
b
的组合c
是独一无二的。

我试着和一群人一起解决这个问题:

select a, b, c, min(d), min(e) from my_table
group by a, b, c

这种方法行不通,因为它不会从

my_table
返回实际存在的行,因为列
d
e
的最小值可以在不同的行中。此外,
min
不是一个合适的函数,因为它不返回随机行。

我怎样才能实现它?

我正在使用基于 Presto 构建并运行标准 ANSI SQL 的 amazon athena。

sql amazon-athena presto
2个回答
1
投票

我没有安装 Presto,只有 Trino(但 Athena 引擎 v3 应该基于 Trino),在 Trino 中,您可以尝试使用

min_by
/
max_by
函数将它们与
random
结合起来用于“订购”和一些
ROW
魔法:

select a, b, c, 
    min_by((d, e), random()).* as (d, e)
from my_table
group by a, b, c

另一种适用于 v2 和 v3 引擎的方法是在分区上使用

row_number
窗口函数并再次使用
random
进行排序:

select a, b, c, d, e 
from(
    select *,
       row_number() over(partition by a, b, c order by random()) rn
    from dataset)
where rn = 1

1
投票

你没有告诉你正在使用哪个DBMS,所以不可能给出完整的解决方案。

但策略是

  1. 使用窗口函数 对具有相同 a、b、c 的行进行分组。在 Oracle 中,这类似于 ``SELECT a, b, c, (row_number() over (partition by a, b, c order by a, b, c)) id_row
  2. 使用另一个 select 从第一个 select 中选择行,使用 random() 函数——但是你必须查看你的 DBMS 文档以找出使用哪个函数
© www.soinside.com 2019 - 2024. All rights reserved.