要在表中加入的SQL查询

时间:2014-08-13 05:40:49

标签: sql performance

 ID | Doc ID | Acc Type | PID
 ============================
 1  |  3     |  WRAP    |234
 2  |  3     |  WRAP    |235
 3  |  4     |  NWRAP   |236
 4  |  5     |  WRAP-T  |237
 5  |  6     |  NWRAP-T |238
 6  |  3     |  WRAP    |241
 7  |  5     |  WRAP-T  |241
 8  |  4     |  NWRAP   |245
 9  |  6     |  NWRAP-T |245

从上表中可以看到一些PID只有一个文档,其中一些(241& 245)附加了多个文档。我需要编写一个查询来显示Doc ID 3,4,5或6的PID和Acc Type。但是这个查询不应该重复多行。在我的情况下,241应显示为WRAP Acc类型,245应显示为NWRAP Acc类型,两者都不应重复。

Doc ID 3& 5与4和4相同。 6.可以存在具有Doc ID 3和3的进程ID。 5可以是同时具有4& 4的DOC ID。 6.此外,可以存在PID,其仅具有3或仅具有4或仅具有5或仅​​具有6的PID。 5附有PID我们需要将其视为3.如果4& 6附有PID,我们需要将其视为4。

请帮我写这个查询。我完全厌倦了尝试这个SQL新手。

2 个答案:

答案 0 :(得分:0)

我认为这应该有效。我觉得在子查询中明确地命令结果更安全,但你可能没有它。

select * from (select doc_id, acc_type, PID from table order by PID,doc_id) t1 group by PID 

答案 1 :(得分:0)

尝试以下

说明:

子查询Q1为每个pid提供doc_id的min,然后再将其连接到表中,以便仅根据此pid和min_doc_id获取这些行。

select Q1.pid,Q2.acc_type,Q1.min_doc_id from 
(select distinct pid ,min(doc_id) over (partition by pid) as min_doc_id  from n_bc1 ) Q1
join n_bc1 Q2
on Q1.pid = Q2.pid and q1.min_doc_id = q2.doc_id; 

对于您的给定数据,输出将是

pid acc_type    min_doc_id
234 WRAP        3
235 WRAP        3
236 NWRAP       4
237 WRAP-T      5
238 NWRAP-T     6
241 WRAP        3
245 NWRAP       4