【问题标题】:MySQL how to select the first non null value in group byMySQL如何选择group by中的第一个非空值
【发布时间】:2019-01-25 16:10:08
【问题描述】:

我有这张桌子

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

但是索尼娅有一个空值,我想得到这个:

user    test
-----------------
john    aaaaa
sonya   cccccc

现在,我知道有一些方法可以从 group by 中获取 sum、count、max、min 等,但我想知道是否有任何方法可以获取第一个非 null 值

有人可以帮忙吗?

【问题讨论】:

  • GROUP BY 没有任何聚合是没有意义的。在大多数 SQL 实现中,您的代码都是非法的。
  • 试试MIN(test) :)
  • 使用 WHERE IS NOT NULL 删除 NULL,您将得到“TOP N 行”任务,该任务通常在 SO 和 Web 上广泛记录。
  • 如果没有对行排序的规范,确定哪个值是“第一个”的概念没有任何意义。我们可以很容易地使用聚合函数优先考虑非 NULL 值,例如MIN(test) 或 MAX(test) 都将在 NULL 值之前返回非 NULL 值。如果我们需要按id 列排序的给定用户的行,那就是另一个蜡球......

标签: mysql group-by null extract


【解决方案1】:

试试这个查询

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
  )

【讨论】:

    【解决方案2】:

    您可以按用户对 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-22
      • 2021-07-11
      • 2023-03-21
      • 2013-03-03
      • 2016-04-10
      • 2017-09-02
      • 1970-01-01
      • 2012-05-26
      相关资源
      最近更新 更多