2017-09-18 103 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; 
相關問題