我有一个查询,我需要获得一个不同的列表,其中有一个字段可能有同一行的多个条目。为了澄清,我有两个字段CN和PN,它们通常组成一个唯一的集合,但在某些情况下,它们与CC组合成多行。该集合如下所示:
CN PN CC
123 123 C23
123 123 C24
124 124 C23
因此在大多数情况下,distinct的结果会产生CN = 124的行。在少数情况下,结果就像CN = 123,其中有两个不同的CC。如果我只使用选择不同的查询,我会得到上面的结果集。我正在寻找的是123行的一行和124行的一行。适用的CC需要为C23。我的客户实际要求的是根据她对最重要的CC值的标准选择CC。她希望C23第一,C24第二,C52第三,C37第四。
我想我可以分两步完成这个过程,我选择除了CC以外的所有内容,然后在获得基于CN和PN的唯一集合后,使用CC信息加入到表中。
我很乐意回答任何问题或疑虑。
答案 0 :(得分:1)
您可以使用row_Number()
进行此优先排序查询:
select cn, pn, cc
from (select t.*,
row_number() over (partition by cn, pn
order by charindex(cc, 'C23,C24,C52,C37')
) as seqnum
from t
) t
where seqnum = 1;
charindex()
只是排序值的简写;它在任何情况下都不会起作用(但方便易读)。更传统的方式是(case cc when 'C23' then 1 when 'C24' then 2 when 'C52' then 3 when 'C37' then 4 else 5 end)
。
答案 1 :(得分:0)
尝试以下解决方案,看看它是否适合您:
SELECT *
FROM (SELECT DISTINCT CN, PN FROM [Table]) t
CROSS APPLY
(
SELECT TOP 1 CC
FROM [Table] t0
WHERE t0.CN = t.CN AND t0.PN = t.PN
ORDER BY CASE CC WHEN 'C23' THEN 0 WHEN 'C24' THEN 1 WHEN 'C52' THEN 2 WHEN 'C37' THEN 3 END
) t1