选择一列中重复编号的记录,另一列中选择唯一字符串

Posted

技术标签:

【中文标题】选择一列中重复编号的记录,另一列中选择唯一字符串【英文标题】:Selecting records with duplicate number in one column, and a unique string in another 【发布时间】:2017-01-05 02:16:53 【问题描述】:

我有一个 Postgres 记录表,其中包括许多具有 reg_number 的新归档帐户,以及许多现在已使用相同 reg_number 完成的归档帐户。

由于不一致,我无法按日期或行号查询。

我需要能够选择: 任何归档的行 - 尚未最终确定, 任何已完成的行,但不是其原始“归档”行。

源数据表

reg_num   |  file_final   |  otherCols  
1234      |   filed       |   foo  
1234      |   final       |   foo  
1235      |   filed       |   foo  
1218      |   filed       |   foo  
1111      |   final       |   foo  
1235      |   final       |   foo  

想要的选择:

reg_num   |  file_final  |  otherCols  
1234      |   final      |   foo  
1218      |   filed      |   foo  
1111      |   final      |   foo  
1235      |   final      |   foo  

我尝试了多种 SELECT DISTINCT ON 和 JOINS 的组合,但是我卡住了。 上面显示了两个相关字段,整个表还有大约 25 个其他列, 我需要能够从中进行选择。

任何帮助将不胜感激。谢谢! 我尝试过的一些查询(10 多个)包括:

选择 * FROM ca_enforce 在哪里注册号码 ( SELECT DISTINCT ON (reg_number) reg_number WHERE file_final = 'Final' 或 file_final = '归档' 按 reg_number 分组 );

另一个:

在 reg_number 上选择 DISTINCT, 身份证, col3, col4, 文件_最终, col6, col7, 注册号 WHERE file_final = '决赛' FROM my_table 按 file_final 排序;

【问题讨论】:

【参考方案1】:

联合技术强制 PostGreSQL 对数据进行两次传递。

使用 reg_num 列上的索引,以下查询应该执行得更快:

select reg_num, file_final, otherCols
from t t1
where file_final = 'final' or not exists (
  select *
  from t t2
  where t2.reg_num = t1.reg_num and t2.file_final = 'final');

【讨论】:

感谢两位回复。我接受了这个,因为它以最少的调整给出了结果......这只是因为我必须将两个“t”表引用更改为相同的 schema.table 名称。谢谢!这有助于揭示数据源方法中的一个巨大缺陷,即错误分类了大约 30% 的记录。【参考方案2】:

听起来像是两个可以联合在一起的查询:

--get all of the filed records that don't have final records.
select reg_num
from my_table
where reg_num not in (
  select reg_num
  from my_table
  where final_file = 'final'
)
where final_file = 'file'

union all
--get all of the final records.
select reg_num
from my_table
where file_final = 'final'

【讨论】:

【参考方案3】:
select reg_num,file_final,othercols
from table_name
where reg_num not in (
              select reg_num
              from table_name
               where final_file = 'final'
                     )
union all
select reg_num,file_final,othercols
from table_name
where file_final = 'final'

【讨论】:

以上是关于选择一列中重复编号的记录,另一列中选择唯一字符串的主要内容,如果未能解决你的问题,请参考以下文章

选择小于另一列中特定值的唯一值

调整相对于 2 列的选择以在一列中返回最大值以用于另一列中的重复条目

MYSQL在由另一列排序的列中选择特定数量的重复值

SQL:在一个列中查找在另一列中也不唯一的非唯一记录

如何根据bigquery中另一列中的重复值计算一列

在一列中选择该值未在另一列中出现 5 次的值