通过在组条件选择寄存器

问题描述 投票:2回答:3

比方说,我有TYPE & COLOR两列可以有重复值的两列一个表,但我需要一个寄存器用于在类型列,并在颜色列中的每个值获得的价值根据层次1个蓝色,2-绿色,3黑,4红和最后5白色。为了解释自己更好,我有表在图1中,而我wan't结果是在图2中。

我可以用MIN()GROUP BY的类型值,但我怎么能根据层次得到的颜色值?

enter image description here

sql sql-server
3个回答
2
投票

这里有一个方法:

select t.*
from (select t.*,
             row_number() over (partition by t.type order by v.ord) as seqnum
      from t join
           (values (1, 'blue'), (2, 'green'), (3, 'black'), (4, 'red'), (5, 'white')
           ) v(ord, color)
           on t.color = v.color
     ) t
where seqnum = 1;

您还可以使用与case一个巨大的row_number()的表情,但我觉得这是更容易跟踪和维护。


3
投票

这可能是一种方法。

WITH CTE AS(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY type ORDER BY CASE color WHEN 'blue'  THEN 1
                                                                    WHEN 'green' THEN 2
                                                                    WHEN 'black' THEN 3
                                                                    WHEN 'red'   THEN 4
                                                                    WHEN 'white' THEN 5 END) rn
    FROM SomeTable
)
SELECT type, color
FROM CTE
WHERE rn = 1;

1
投票
SELECT DISTINCT 
TYPE
, LAST_VALUE(COLOR) OVER (PARTITION BY COLOR ORDER BY (SELECT NULL))
FROM table

但是,SQL Server不能保证COLOR名的顺序,直到你有明确的ORDER BY抢七(而不是SELECT NULL),例如,表ID。希望您至少有SQL Server 2012中,也可以是2008 R2 SP3。

热门问题
推荐问题
最新问题