Postgresql 如何生成一个随机的组样本,包括组中的所有人,其中组id(而不是人员id)随时间变化?

Postgresql 如何生成一个随机的组样本,包括组中的所有人,其中组id(而不是人员id)随时间变化?,postgresql,random-sample,Postgresql,Random Sample,我有如下数据: +----------+-----------+------------+------+ | group_id | person_id | is_primary | year | +----------+-----------+------------+------+ | aaa1 | 1 | TRUE | 2000 | | aaa2 | 1 | TRUE | 2001 | | aaa3 |

我有如下数据:

+----------+-----------+------------+------+
| group_id | person_id | is_primary | year |
+----------+-----------+------------+------+
| aaa1     |         1 | TRUE       | 2000 |
| aaa2     |         1 | TRUE       | 2001 |
| aaa3     |         1 | TRUE       | 2002 |
| aaa4     |         1 | TRUE       | 2003 |
| aaa5     |         1 | TRUE       | 2004 |
| bbb1     |         2 | TRUE       | 2000 |
| bbb2     |         2 | TRUE       | 2001 |
| bbb3     |         2 | TRUE       | 2002 |
| bbb1     |         3 | FALSE      | 2000 |
| bbb2     |         3 | FALSE      | 2001 |
+----------+-----------+------------+------+
数据设计是这样的

  • person\u id
    跨时间唯一标识个人
  • group\u id
    在每年内唯一标识一个组,但每年都可能发生变化
  • 每个组包含主要和非主要个体
  • 我的目标有三个:

  • 从主要个体中随机抽取样本,例如10%
  • 获取这些主要个体在数据库中出现的所有时间段的数据
  • 获取与在第一步和第二步中取样的任何主要个体共享一个组的任何非主要个体的数据
  • 我不确定从哪里开始,因为我需要首先随机抽取主要个体的样本,并获取他们的所有观察结果。大概我可以通过在任何
    个人id
    中生成一个相同的随机数来实现这一点,然后基于该随机数进行采样。然后,我需要获取包含任何主要个体的
    group\u id
    列表,并提取与那些
    group\u id
    相关的所有记录


    我不知道从何处开始这些查询和子查询,不幸的是,我用于访问此数据库的界面无法在单独的查询之间链接信息,因此我无法为主要个人提取随机
    个人id
    ,然后在第二次查询中使用该文本文件过滤
    组id
    ;我必须在一个查询中完成所有操作。

    完成此操作的快速方法是:

    select
      data_result.*
    from
      data as data_groups join
      (select
         person_id
       from
         data
       where
         is_primary
       group by
         person_id
       order by
         random()
       limit 1) as selected_primary
       ON (data_groups.person_id = selected_primary.person_id)
       JOIN data AS data_result ON (data_groups.group_id = data_result.group_id AND data_groups.year = data_result.year)
    
    我甚至做了个测试,你可以测试一下

    查询非常简单,它获取样本,然后获取他们的组,然后获取这些组的所有用户

    由于数据集太少,请注意限制1条款。您可以输入一个值或一个获得正确百分比的查询

    如果有人有一个使用窗口功能的答案,我想看看


    注意:下次请提供模式和数据插入,以便更容易回答。

    谢谢您的帮助。我如何调整它,将表名(
    data
    )别名为更短的名称?在实际数据库中,表名要长得多。否则,我认为这是可行的,我会尽快接受。这是否可以解释
    组id
    每年都会变化的事实?基于fiddle,我想是的,但我不是100%确定。甚至可以将
    数据
    表名别名为其他名称,这样,如果我只想在第一个
    select
    语句中从表中选择某些变量(而不是
    select data.
    ),我就不必包含完整的(长的)表名在实际查询中不止一次?您可以在每个from子句上为表名添加别名,但我认为您不能创建一个别名。因此,对于这个查询,您必须编写3次。我将编辑这篇文章来展示这一点,并考虑到今年的情况。