首页 > 解决方案 > 案例优先级查询中的 PostgreSQL 问题

问题描述

我正在使用 PostgreSQL。我被困在构建查询中。如果任何一个优先级与案例匹配,我们如何通过优先考虑数据并丢弃其余数据来搜索结果?

按家庭明智分组

如果家庭中的一个人的承诺级别为“VOTER”,那么应该获取它而不是同一家庭中其他状态不同的人,例如“COMMITTED”、“REACHOUT”或“NEUTRAL”</p>

如果家庭中的一个人的承诺级别为“COMMITTED”,那么应该获取它而不是同一家庭中状态不同的其他人,例如“REACHOUT”或“NEUTRAL”</p>

该层次结构遵循“VOTER”、“COMMITTED”、“REACHOUT”、“NEUTRAL” 如果家庭中的所有人员都具有相同的承诺级别,则应获取人员手机号码(如果不为空)。

其他被丢弃

带有数据的示例表

ID  COMMITTED LEVEL MOBILE NUMBER   FAMILY NUMBER
1   VOTER               234828288       1
2   COMMITED            262349911       1
3   COMMITED            924792922       2
4   REACHOUT            82639472        2
5   VOTER               79246826234     3
6   VOTER               NULL            3

输出:预期结果

ID  COMMITED LEVEL      MOBILE NUMBER   FAMILY NUMBER
1   VOTER               234828288       1
3   COMMITED            924792922       2
5   VOTER               79246826234     3

标签: sqlpostgresql

解决方案


您可以使用以下方法执行此操作distinct on

select distinct on (family_number) t.*
from t
order by family_number,
         (case when committed_level = 'Voter' then 1
               when committed_level = 'COMMITTED' then 2
               when committed_level = 'REACHOUT' then 3
               when committed_level = 'Neutral' then 4
               else 5
          end),
         (case when mobile_number is not null then 1 else 2 end);

推荐阅读