如何为每个组选择随机记录

时间:2020-02-11 09:28:16

标签: sql postgresql select greatest-n-per-group window-functions

我有一张桌子

 |    A   | B | C | D |
 |--------|---|---|---|
 | Value1 | x | x | x |
 | Value1 | y | x | y |
 | Value1 | x | x | x |
 |        ....        |
 | Value2 | x | x | x |
 | Value2 | x | x | x |
 | Value2 | x | x | x |
 |        ....        |
 | Value3 | x | x | x |
 | Value3 | x | x | x |
 | Value3 | x | x | x |

其中A列可以有一组值。我想获得A列中每个唯一值的随机记录。

2 个答案:

答案 0 :(得分:2)

您可以使用窗口功能:

select *
from (
    select 
        t.*,
        row_number() over(partition by a order by random()) rn
    from mytable t
) t
where rn = 1

row_number()为具有相同a的组中的每个记录分配一个随机等级;然后,外部查询每组过滤一条记录。

实际上,由于您正在运行Postgres,因此也可以使用distinct on,它可以提供更好的性能(和较短的语法):

select distinct on (a) t.*
from mytable t
order by a, random();

答案 1 :(得分:1)

您可以使用String jsonString = ""; try { JSONObject obj = new JSONObject(); obj.put("email", "abc@xyz.com"); obj.put("pwd", "12356"); jsonString = obj.toString(); //out put like this -> {"email":"abc@xyz.com","pwd":"123456"} Log.d("JsonString__",jsonString); }catch (Exception e){}; 来做到这一点:

distinct on

Here is a Demo

在DISTINCT ON上,您告诉PostgreSQL为每个返回一行 ON子句定义的唯一组。

有关此主题的更多信息:https://www.geekytidbits.com/postgres-distinct-on/