2017-09-18 26 views
1

我有表选择一个不同领域的其他第一个非空或空

| Id | val | 
| --- | ---- | 
| 1 | null | 
| 1 | qwe1 | 
| 1 | qwe2 | 
| 2 | null | 
| 2 | qwe4 | 
| 3 | qwe5 | 
| 4 | qew6 | 
| 4 | qwe7 | 
| 5 | null | 
| 5 | null | 

有没有简单的方法来选择与第一个非空“VAL”价值观不同的“身份证”的值。如果不存在,则为空。例如 结果应该是

| Id | val | 
| --- | ---- | 
| 1 | qwe1 | 
| 2 | qwe4 | 
| 3 | qwe5 | 
| 4 | qew6 | 
| 5 | null | 
+2

你们认为 “第一” 不是空值?你按什么排序? – HoneyBadger

+1

您是否尝试过'group by'? – Stefan

+0

对我来说基本上最重要的是'val',我需要为每个不同的Id获得1'val',如果不存在,那么它是ANY非空值。不管它是哪个“val”col价值都没有关系。它可以是随机的,但如果可能的话不能为空。我不知道如何问更具体:) – Vsln

回答

2

在你的情况简单的GROUP BY应该是解决方案:

SELECT Id 
     ,MIN(val) 
    FROM dbo.mytable 
GROUP BY Id 

每当使用GROUP BY,你必须使用所有列上,这是一个非集合函数列于GROUP BY

如果一个Id的值(val)不是NULL,则返回该值。
如果只有NULLs为Id,则会返回NULL
据我了解(关于你的评论),这正是你将要采取的方法。

如果你总是希望有“第一”值<>NULL,你需要另一个分类标准(如时间戳列),可能能够与WINDOW-function来解决这个问题。

+0

噢谢谢。它实际上是这样做的方式。不知何故,我认为它应该是更复杂的东西 – Vsln

+0

一直发生在我身上^^ –

1

如果你想第一NULL值(其中,“第一”,是基于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; 
1

SQL Fiddle:

Create Table from SQL Fiddle: 

CREATE TABLE TAB1(PID整数,ID整数,VAL VARCHAR(25))

Insert dummy records : 
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; 
相关问题