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