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;