【问题标题】:select each 2 random records from a distinct group从不同的组中选择每 2 个随机记录
【发布时间】:2018-05-02 16:07:37
【问题描述】:

这是我的表格的截图,我的 DBMS 是 postgresql

field_1 是我记录的唯一键,field_2 是组码,field_4 是电话号码。

从这里我想从一个不同的组中选择 2 个随机记录。 换句话说,选择2个随机记录并按field_2分组

我只能在下面进行查询。

 select distinct(field_2) as group_name from mytable group by 1

.. 请帮助我继续我的项目:(

【问题讨论】:

  • distinct 不是函数。
  • edit您的问题和基于您的样本数据的预期输出。 Formatted textno screen shots。 (edit 您的问题 - 在 cmets 中邮政编码或其他信息)。我不清楚结果是否应该包含总共两行或两行每组(由field_2 定义)

标签: postgresql select random


【解决方案1】:

试试下面的查询:

SELECT DISTINCT ON (field_2) *
FROM table 
ORDER BY (field_2),random() 
LIMIT 2

这将返回field_2的2条随机记录:

SELECT
  *
FROM (
  SELECT
    ROW_NUMBER() OVER (PARTITION BY field_2 ORDER BY (field_2 ),random()) AS r,
    t.*
  FROM
    mytable t) x
WHERE
  x.r <= 2

【讨论】:

  • 这只返回 2 条记录 :(
  • 但没有限制2,返回组内只有一个随机选择记录的所有记录
  • (SELECT DISTINCT ON (field_2) * FROM table ORDER BY (field_2),random() ) Union (SELECT DISTINCT ON (field_2) * FROM table ORDER BY (field_2),random() )
【解决方案2】:

您可以编写以下查询:

SELECT * FROM mytable GROUP BY field_2 ORDER BY RAND() LIMIT 0,2

【讨论】:

  • 我猜 postgresql 或者我的 Postgresql 版本不支持 limit #,# 语句 :(
  • @PilKwon:答案确实对Postgres无效,因为Postgres使用limit x offset y
  • 我应该将 LIMIT 0,2 切换到限制 2 偏移 0 吗?
  • @PilKwon:您还需要将 rand() 更改为 random(),因为 Postgres 也没有 rand() 功能。
【解决方案3】:

我不知道您的预期输出,也许这可以帮助您: 组中随机的第一顺序(field_2) 选择第一个和第二个field_1,然后输出

with temp_shuffel as
(
select 
*
from public.tbl_test
order by field_2,  random()
),

temp_values as
(
select 
nth_value(field_1,1) over (PARTITION by field_2 order by field_2 rows between unbounded preceding and unbounded following) as f1,
nth_value(field_1,2) over (PARTITION by field_2 order by field_2 rows between unbounded preceding and unbounded following) as f2
 from temp_shuffel
)

select distinct on (f1,f2)
row1.field_1,
row1.field_2,
row1.field_4,

row2.field_1 as field2_1,
row2.field_2 as field2_2,
row2.field_4 as field2_4

from temp_values
left join public.tbl_test as row1  on row1.field_1 = temp_values.f1
left join public.tbl_test as row2 on row2.field_1 = temp_values.f2
order by f1,f2,row1.field_1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    相关资源
    最近更新 更多