MySQL如何选择group by中的第一个非空值

MySQL如何选择group by中的第一个非空值,mysql,group-by,null,extract,Mysql,Group By,Null,Extract,我有这张桌子 ID user test ----------------- 1 john aaaaa 2 john aaaaa 3 john bbbbb 4 john NULL 5 john ddddd 6 sonya NULL 7 sonya cccccc 8 sonya dddddd 9 sonya aaaaaa 我需要编写一个查询,为每个用户提取test的第一个非空值 如果我做一个小组 SELECT

我有这张桌子

ID  user    test
-----------------
1   john    aaaaa
2   john    aaaaa
3   john    bbbbb
4   john    NULL
5   john    ddddd
6   sonya   NULL
7   sonya   cccccc
8   sonya   dddddd
9   sonya   aaaaaa
我需要编写一个查询,为每个用户提取test的第一个非空值

如果我做一个小组

SELECT
    user,
    test,
FROM table
GROUP BY user
我得到这个结果集

user    test
-----------------
john    aaaaa
sonya   NULL
但是sonya有一个空值,我想得到:

user    test
-----------------
john    aaaaa
sonya   cccccc
现在,我知道有一些方法可以从group by中获取SUMME、count、max、min等,但我想知道是否有任何方法可以获取第一个非空值

有人能帮忙吗?

试试这个查询

select id, user, test
from T
where id in (
     select min(id) 
     from T as tin 
     where tin.user = T.user and tin.test is not null 
     group by tin.user
  )

您可以在子查询中使用内部联接来按用户划分min(id)(第一行)组

  select m.id, m.user, m.test
  from my_table m
  INNER JOIN (
       select user, min(id) as min_id
       from my_table 
       where test is not null 
       group by user
  ) t on t.uset = m.user and t.min_id = m.id

分组依据
没有任何聚合是没有意义的。在大多数SQL实现中,您的代码都是非法的。请尝试使用
MIN(test)
:)删除
WHERE NOT NULL
中的空值,这样您就只剩下SO和Web上广泛记录的“TOP N rows”任务。如果没有对行排序的规范,确定哪个值是“first”的概念没有任何意义。我们可以很容易地使用聚合函数优先选择非NULL值,例如,MIN(test)或MAX(test)都将在NULL值之前返回非NULL值。如果我们需要按
id
column排序的给定用户的行,那么这是一个不同的蜡球。。。