具有不同和最高值

时间:2017-08-08 18:37:01

标签: sql sql-server

我有一个查询,我需要获得一个不同的列表,其中有一个字段可能有同一行的多个条目。为了澄清,我有两个字段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信息加入到表中。

我很乐意回答任何问题或疑虑。

2 个答案:

答案 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