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
在每年内唯一标识一个组,但每年都可能发生变化个人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次。我将编辑这篇文章来展示这一点,并考虑到今年的情况。