繁体   English   中英

POSTGRESQL:如何选择对 B 具有多个配对值的值 A?

[英]POSTGRESQL : How do I select values A that have multiple pairing values for B?

背景

我有一个用于跟踪用户帐户更改的表。 a列是这个accounthistory-table的主键, b列是一个外键,包含account-table中一个账户的主键, c列包含更改时的用户名, d列有时间戳更改和e列描述了执行的操作是什么,来自选项 INSERT / UPDATE / DELETE。

在给定时间,只能有一个用户名c 的帐户b ,但跨时间多个帐户b可以具有相同的用户名值c (参见表中的示例 b=20 和 b=07)。 由于还有其他列,所有帐户都可以有多个 UPDATE 或 INSERT + UPDATE,因此每个c值应该在插入一段时间后至少有 2 行。

题:

下面是一个数据示例。 我需要弄清楚的是“至少更改了一次用户名的帐户”,因此b 的值具有多行, c 的值不同。 我只对b列的值感兴趣,因为我需要在进一步的选择查询中使用结果。

表accounthistory:

一种 C d 电子
100 15 托马 2021-11-15 16:22:40.747766 更新
99 20 瓦尔特 2021-11-13 08:22:40.747766 更新
98 17 米特克 2021-11-12 15:22:40.747766 插入
97 15 托米亚 2021-11-10 08:22:40.747766 更新
96 20 瓦尔特 2021-11-09 07:22:40.747766 插入
95 15 托米亚 2021-10-21 20:22:40.747766 插入
94 12 亚力克 2021-10-18 18:22:40.747766 插入
93 07 瓦尔特 2021-10-15 10:22:40.747766 删除
92 04 尤尔 2021-10-12 10:22:40.747766 删除
91 07 瓦尔特 2021-10-05 10:22:40.747766 插入

预期结果将是 15,因为它同时具有用户名 'tomia' 和 'toma',其他b 's 只有c 的匹配值,并且 07 和 20 都具有用户名 'valt' 并不重要,因为 07 是在添加 20 之前删除。

那么有没有办法为b选择这些值,我尝试形成不同的 group by 和其他凌乱的查询,但由于我在使用 postgresql 和 sql 方面是新手,所以我一直无法让它工作。

先感谢您!

您可以使用exists来确定哪一列b至少有 1 列c不具有相同的列c 然后使用distinct on来消除重复项。 演示在这里

select distinct on (b) b 
  from accounthistory ah1
 where exists ( 
                select null 
                  from accounthistory ah2
                 where ah2.b = ah1.b
                   and ah2.c <> ah1.c
              ) 
 order by b;

 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM