1

'test_table' 包含一个名为 vendor 的列,char 值从 1 到 9,1 是最高优先级。'test_table' 还有另一个名为 match 的列,其 char 值为 'I' 或 'H',而 'I' 获得更高的优先级。我想返回 ID 中具有唯一值的所有行,按匹配优先,然后是供应商。

测试表

ID  Vendor  Match  
 1    3      I  
 1    2      I  
 1    4      H  
 2    1      H  
 2    1      I  
 3    1      H  
 3    2      I  

期望的结果

ID  Vendor  Match   
1     2   I  
2     1   I   
3     2   I  


SELECT *
FROM 
    (SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) AS RowNo, * 
     FROM test_table) x
WHERE RowNo = 1 
ORDER BY ID

任何帮助将不胜感激。谢谢!

4

2 回答 2

1

您需要为 match 列设置一个 order by 子句(字符比较基于 ascii 值),另一个在 vendor 列上。您甚至可以删除asciikeyowrd (为了清楚起见,我已经写过),只需按子句顺序使用列名

尝试这个 :

 ;With cte as 
  ( 
  Select ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ascii(match) desc ,vendor )
   AS RowNo,  Id,Vendor ,Match 
  FROM test_table
  )
  Select Id,Vendor,Match from cte
  WHERE RowNo = 1 
于 2012-07-20T06:03:55.573 回答
1
SELECT Id,Vendor,Match
FROM 
    (SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID,Match Desc,Vendor Asc) AS RowNo, * 
     FROM test_table ) x
WHERE RowNo = 1 
ORDER BY ID
于 2012-07-20T06:29:03.567 回答