【问题标题】:SELECT distinct rows grouped by column nameSELECT 按列名分组的不同行
【发布时间】:2014-10-30 12:43:17
【问题描述】:

我有一个场景,我需要选择员工的最新 ID。 id 可以是 varchar 或 int

id      mail
-------------
1234    xyz@abc.com
5678    xyz@abc.com
C123    xyz@abc.com
C234    def@abc.com

现在,我的查询结果只需

id      mail
-------------
5678    xyz@abc.com
C234    def@abc.com

逻辑是,如果邮件 id 有一个整数,则必须选择最大的整数。如果没有整数,则可以选择 varchar 值。

试过

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

但是当有重复的邮件 ID 时,它会选择 varchar 值。

【问题讨论】:

  • 您是否有任何其他列可以用来确定最新的,例如插入日期?

标签: sql sql-server


【解决方案1】:

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

DECLARE @T TABLE (id VARCHAR(10), mail VARCHAR(100))
INSERT @T VALUES 
    ('1234', 'xyz@abc.com'),
    ('5678', 'xyz@abc.com'),
    ('C123', 'xyz@abc.com'),
    ('C234', 'def@abc.com')

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       def@abc.com
5678       xyz@abc.com

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2018-08-24
      • 2016-12-10
      • 2021-06-25
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 2010-12-14
      • 2017-06-18
      • 1970-01-01
      相关资源
      最近更新 更多