从具有列abcdemy_table行中,我想随机 Select N行,使得列abc的组合是唯一的.

我试着和一个小组一起解决这个问题,方法是:

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

这种方法不起作用,因为它不返回my_table中的实际现有行,因为列de的最小值可以在不同的行中.此外,min不是一个合适的函数,因为它不返回随机行.

我怎样才能做到这一点?

我正在与亚马逊雅典娜合作,它建立在Presto上,运行标准的ANSI SQL.

推荐答案

我没有安装Presto,只安装了Trino(但Athena Engine v3应该是基于Trino的),在Trino中,你可以try 使用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

Sql相关问答推荐

在SQL:2003(PGQ)中,Cypher查询语言、GQL、PGQL和属性图查询的常见子集是什么?'

在甲骨文中查找前一个星期一的S日期

SQL Oracle条件分组依据

检索上一个星期四和上一个星期三

在数据库中搜索列

SQL:如何取上一年的平均值?

在Postgres中合并相似的表

比较SQL中以逗号分隔的字符串

如何将不同层次的产品组和规格组合到最深一层?

每次计数器增加时通过运行总重置进行分组

汇总具有连续日期范围的行

根据开始时间和结束时间计算has_impact字段

COBOL\DB2作业(job)需要帮助?快来获取专业指导!

自动生成计算频率的列

try 将多行折叠为单个结果

编写查询以根据级别 (p2) 返回父位置

更新表 A,然后将新值插入表 B(包含更新内容的历史日志(log))

具有日期时间条件的存储过程

当计数为 0 时显示行

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