让我们回答一个更简单的问题:对于每个id,获取字母中最后一个的Val。如果Y和N是唯一的值,这将起作用。而且查询要简单得多:
SELECT t.ID, MAX(t.Val) FROM t GROUP BY t.ID;
因此,将您的情况简化为简单的情况。使用枚举(如果数据库支持),或者将值代码分成带有排序规则列的另一个表(在这种情况下,Y可以有1个,N可以有2个,所有其他可能的值可以有999个,并且您希望最小 )。然后
SELECT ID, c.Val FROM
(SELECT t.ID, MIN(codes.collation) AS mx
FROM t join codes on t.Val = codes.Val GROUP BY t.ID) AS q
JOIN codes c ON mx=c.collation;
这里的代码有两列,Val和Collat??ion。
您也可以使用CTE类型查询来执行此操作,只要您按需要对值进行排序即可。这种方法只有一个联接到一个小的查找表,并且比3个自联接要快得多。
WITH q AS (SELECT t.id, t.Val, ROW_NUMBER() AS r FROM t JOIN codes ON t.Val=codes.Val
PARTITION BY t.id ORDER BY codes.collation)
SELECT q.id, q.Val WHERE r=1;