2014-10-30 54 views
0

我有一个场景,我需要选择员工的最新ID。该ID可以是一个varchar或INT按列名分组的SELECT distinct行

id  mail 
------------- 
1234 [email protected] 
5678 [email protected] 
C123 [email protected] 
C234 [email protected] 

现在,我的查询结果只是必须有

id  mail 
------------- 
5678 [email protected] 
C234 [email protected] 

的逻辑是,如果没有针对邮件ID的整数,最高整数必须被挑选。如果没有整数,则可以选取varchar值。

试图

select max(id), mail from worker group by mail 

但如果有重复的邮件ID则会选取VARCHAR值。

+1

你有任何其他列则可以按确定的最新,就像插入日期? – 2014-10-30 12:47:37

回答

2

我会使用isnumeric值和ROW_NUMBER来选择正确的值。

DECLARE @T TABLE (id VARCHAR(10), mail VARCHAR(100)) 
INSERT @T VALUES 
    ('1234', '[email protected]'), 
    ('5678', '[email protected]'), 
    ('C123', '[email protected]'), 
    ('C234', '[email protected]') 

SELECT id, mail 
FROM (
    SELECT 
     id, 
     mail, 
     ROW_NUMBER() OVER (
      PARTITION BY 
       mail 
      ORDER BY 
       CASE WHEN ISNUMERIC(id) = 1 THEN CONVERT(INT, id) ELSE 0 END DESC, 
       id) AS RowNum 
    FROM @T 
    ) T 
WHERE RowNum = 1 

输出产量

id   mail 
---------- ------------- 
C234  [email protected] 
5678  [email protected] 
+0

是的。这对我来说工作得很好。谢谢 :) – mhn 2014-10-31 09:08:24

0

一个解决方案,我能想到的是:

select MAX(t.id), t.email 
from ( 
    select * from Emails where ISNUMERIC(id) = 1 
     union 
    select * from Emails where ISNUMERIC(id) <> 1 and email not in 
           (select email from Emails where ISNUMERIC(id) = 1) 
) as t 
group by t.email