比方说,我有一个带有两列TYPE & COLOR
的表,两列都可以有重复值,但是我需要为TYPE列中的每个值获取一个寄存器,并在COLOR列中根据以下值获取值等级1蓝色,2绿色,3黑色,4红色和最后5白色。为了更好地说明自己,我在图1中显示了表格,而我想要的结果在图2中显示。
我可以使用MIN()
和GROUP BY
获取TYPE值,但是如何根据层次结构获取颜色值?
答案 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。