如何生成一组随机样本,包括组中的所有人,其中 group_id(但不是 person_id)随时间变化?

How do I generate a random sample of groups, including all people in the group, where the group_id (but not the person_id) changes across time?

我有这样的数据:

+----------+-----------+------------+------+
| 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 |
+----------+-----------+------------+------+

数据设计是这样的

  1. person_id 跨时间唯一标识一个人
  2. group_id 在每年内唯一标识一个组,但可能会逐年变化
  3. 每个组包含主要和非主要个体

我的目标有三个:

  1. 获取随机样本,例如10%,主要个体
  2. 获取这些主要个体在数据库中出现的所有时间段的数据
  3. 获取与在第一步和第二步中采样的任何主要个体共享一个组的任何非主要个体的数据

我不确定从哪里开始,因为我需要先抽取主要个体的随机样本并获取他们的所有观察结果。据推测,我可以通过生成一个在任何 person_id 中都相同的随机数,然后基于它进行采样来做到这一点。 然后,我需要获取包含任何这些主要个体的 group_id 的列表,并提取与这些 group_id 相关的所有记录。

我不知道从哪里开始这些查询和子查询,不幸的是,我用来访问这个数据库的界面无法 link 跨越单独查询的信息,所以我不能为主要个人拉出随机 person_id 列表,然后使用该文本文件在第二个查询中过滤 group_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)

我什至做了一个fiddle所以你可以测试它。

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

由于数据集太小,请注意那里的Limit 1条款。您可以输入获得正确百分比的值或查询。

如果有人有使用窗口函数的答案,我希望看到。

注意:下次请提供架构和数据插入以便于回答。