Sql 具有不同和最大值的复杂查询

Sql 具有不同和最大值的复杂查询,sql,sql-server,Sql,Sql Server,我有一个查询,我需要得到一个不同的列表,其中有一个字段可能有多个条目用于同一行。为了澄清,我有两个字段CN和PN,它们通常一起构成一个唯一的集合,但是在某些情况下,它们与CC结合形成多行。这一组看起来像这样: CN PN CC 123 123 C23 123 123 C24 124 124 C23 因此,在大

我有一个查询,我需要得到一个不同的列表,其中有一个字段可能有多个条目用于同一行。为了澄清,我有两个字段CN和PN,它们通常一起构成一个唯一的集合,但是在某些情况下,它们与CC结合形成多行。这一组看起来像这样:

CN                PN           CC
123               123          C23
123               123          C24
124               124          C23
因此,在大多数情况下,distinct的结果生成CN=124的行。在一些情况下,结果类似于CN=123,其中有两个不同的CCs。如果我只使用select distinct查询,我会得到上面的结果集。我要找的是一排123和一排124。适用于两者的CC必须为C23。我的客户实际上要求的是根据她对最重要的CC值的标准来选择CC。她想要C23第一,C24第二,C52第三和C37第四

我认为我可以通过两个步骤来完成这项工作,在这两个步骤中,我选择除CC之外的所有内容,然后在获得基于CN和PN的唯一集之后,使用CC信息连接到表中


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

您可以使用
行编号()
进行此优先级查询:

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()
只是对值进行排序的简写;它不会在所有情况下都起作用(但很方便且易于阅读)。更传统的方法是
(当'C23'时为cc,当'C24'时为1,当'C52'时为2,当'C37'时为3,当'C37'时为4,否则为5结尾)

尝试以下解决方案,看看是否适合您:

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