根据组的条件选择寄存器

时间:2019-02-08 15:45:20

标签: sql sql-server

比方说,我有一个带有两列TYPE & COLOR的表,两列都可以有重复值,但是我需要为TYPE列中的每个值获取一个寄存器,并在COLOR列中根据以下值获取值等级1蓝色,2绿色,3黑色,4红色和最后5白色。为了更好地说明自己,我在图1中显示了表格,而我想要的结果在图2中显示。

我可以使用MIN()GROUP BY获取TYPE值,但是如何根据层次结构获取颜色值?

enter image description here

3 个答案:

答案 0 :(得分: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 :(得分: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()表达式,但是我认为这很容易理解和维护。

答案 2 :(得分: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。