Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择一个字段,另一个字段为非空或空_Sql_Sql Server_Distinct - Fatal编程技术网

Sql 选择一个字段,另一个字段为非空或空

Sql 选择一个字段,另一个字段为非空或空,sql,sql-server,distinct,Sql,Sql Server,Distinct,我有一张桌子 | Id | val | | --- | ---- | | 1 | null | | 1 | qwe1 | | 1 | qwe2 | | 2 | null | | 2 | qwe4 | | 3 | qwe5 | | 4 | qew6 | | 4 | qwe7 | | 5 | null | | 5 | null | 是否有任何简单的方法可以使用第一个非空的“val”值选择不同的“id”值。如果不存在,则为空。例如 结果应该是 | Id

我有一张桌子

| Id  | val  |
| --- | ---- |
| 1   | null |
| 1   | qwe1 |
| 1   | qwe2 |
| 2   | null |
| 2   | qwe4 |
| 3   | qwe5 |
| 4   | qew6 |
| 4   | qwe7 |
| 5   | null |
| 5   | null |
是否有任何简单的方法可以使用第一个非空的“val”值选择不同的“id”值。如果不存在,则为空。例如 结果应该是

| Id  | val  |
| --- | ---- |
| 1   | qwe1 |
| 2   | qwe4 |
| 3   | qwe5 |
| 4   | qew6 |
| 5   | null |
在您的情况下,一个简单的分组方式应该是解决方案:

  SELECT Id
        ,MIN(val) 
    FROM dbo.mytable
GROUP BY Id
每当使用GROUP BY时,必须对GROUP BY中未列出的所有列使用聚合函数。 如果Id的值val不是NULL,则将返回此值。 如果Id只有NULL,则返回NULL。 就我对你的评论的理解而言,这正是你要做的

如果您总是希望第一个值为NULL,则需要另一个排序条件,如时间戳列,并可能能够使用窗口函数解决该问题。

在您的情况下,简单的分组方式应该是解决方案:

  SELECT Id
        ,MIN(val) 
    FROM dbo.mytable
GROUP BY Id
每当使用GROUP BY时,必须对GROUP BY中未列出的所有列使用聚合函数。 如果Id的值val不是NULL,则将返回此值。 如果Id只有NULL,则返回NULL。 就我对你的评论的理解而言,这正是你要做的

如果您总是希望第一个值为NULL,那么您需要另一个排序条件,如时间戳列,并且可能能够使用窗口函数来解决它。

如果您希望第一个非NULL值,其中first基于id,那么MIN就不能完全做到这一点。窗口功能包括:

select t.*
from (select t.*,
             row_number() over (partition by id
                                 order by (case when val is not null then 1 else 2 end),
                                          id
                               ) as seqnum
      from t
     ) t
where seqnum = 1;
如果您想要第一个非空值,其中first基于id,那么MIN并不能做到这一点。窗口功能包括:

select t.*
from (select t.*,
             row_number() over (partition by id
                                 order by (case when val is not null then 1 else 2 end),
                                          id
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

创建表tab1pid integer、id integer、val varchar25

创建表tab1pid integer、id integer、val varchar25


你首先考虑的不是空值吗?你们按什么排序?你们试过分组吗?基本上对我来说最重要的事情是'val',我需要为每个不同的Id得到1'val',如果存在任何非空值,如果不存在则为空。它是哪个“val”col值并不重要。它可以是随机的,但如果可能,不能为空。我不确定如何问更具体:你首先考虑的不是空值?你们按什么排序?你们试过分组吗?基本上对我来说最重要的事情是'val',我需要为每个不同的Id得到1'val',如果存在任何非空值,如果不存在则为空。它是哪个“val”col值并不重要。它可以是随机的,但如果可能,不能为空。我不知道如何问得更具体一些:哦,谢谢。事实上,这就是解决问题的方法。不知怎的,我觉得应该更复杂一些事情也一直发生在我身上^^^哦,谢谢。事实上,这就是解决问题的方法。不知怎的,我觉得事情应该更复杂一些,我也经常遇到这种事情^^
 insert into tab1 
    values (1, 1   , null),
    (2, 1   , 'qwe1' ),
    (3, 1   , 'qwe2'),
    (4, 2   , null ),
    (5, 2   , 'qwe4' ),
    (6, 3   , 'qwe5' ),
    (7, 4   , 'qew6' ),
    (8, 4   , 'qwe7' ),
    (9, 5   , null ),
    (10, 5   , null );
fire below query:
SELECT Id  ,MIN(val) as val  FROM tab1  GROUP BY Id;