如何仅选择具有相同值的多行的第一行和特定列?

时间:2015-07-09 13:56:38

标签: sql

我们说我的查询结果如下:

ID    NAME    Phone
----  ----    -----
1     John    123456
2     John    125678
3     John    345678
4     Abby    456789
5     Abby    567890

我想只返回一个名称的单行实例:John,其中的电话号码类似于' 12%'。

3 个答案:

答案 0 :(得分:0)

大多数DBMS支持窗口聚合函数,它会找到每个名称的最低电话号码:

select *
from
 (
   select ID, NAME, Phone,
      ROW_NUMBER() OVER (PARTITION BY NAME 
                         ORDER BY Phone) AS RN
   from tab
   where phone like '12%'
 ) dt 
where RN = 1

答案 1 :(得分:0)

NOT EXISTS解决方案,即只有在没有其他相同名称和12%存在的情况下才返回想要的行,但使用更高的手机#。

select t1.ID, t1.NAME, t1.Phone
from tablename t1
where t1.phone like '12%'
  and t1.name = 'John'
  and not exists (select 1 from tablename t2
                  where t2.phone like '12%'
                    and t2.name = t1.name
                    and t2.phone > t1.phone)

LIMIT的ANSI SQL方式是FETCH FIRST

select ID, NAME, Phone
from tablename
where phone like '12%'
  and name = 'John'
fetch first 1 row only

(许多产品尚未支持。)

答案 2 :(得分:0)

MySql有一个漂亮的聚合函数group_concat(),你可以用它来列出一个人的所有电话号码(用逗号分隔)

SELECT name, group_concat(phone) numbers FROM tbl GROUP BY name

这会让你

name    numbers 
----    --------------------
Abby    456789,567890
John    123456,125678,345678

根据您的条件name='John' and phone LIKE '12%',您将获得

SELECT name, group_concat(phone) numbers FROM tbl 
WHERE name='John' and phone LIKE '12%'
GROUP BY name

您将获得更少的结果,例如

name    numbers
----    -------------
John    123456,125678