2017-02-23 31 views
0

在下面的數據集中,我試圖用NULL LocName刪除ES Hou實體。我想保留其他三條記錄。我一直試圖用row_number()函數來做到這一點,但我不知道如何獲得非空值獲得比空值更高的排名。有什麼建議麼?需要窗口函數來訂購null和非空值

PracticeId LastName EntityId LocId EntityName LocName PracName 
    53681  Thomas 3194  2222 ECS Tampa NULL  NULL 
    53681  Thomas 3195  2222 ECS Atlanta NULL  NULL 
    53681  Thomas 3222  2222 ES Hou  NULL  NULL 
    53681  Thomas 3222  2434 ES Hou  ECS Hou Regional Med 
+0

爲什麼你不用在哪裏? – scaisEdge

+0

是否在實體名稱中檢查了重複?如果所有的行在locname中都爲null會怎麼樣?你只想從中得到任何一行嗎?如果所有這些都是非空的呢?那麼會發生什麼? – GurV

回答

0

你可以使用一個CASEIIF語句進行ROW_NUMBER功能訂購NULL值爲宜。

SELECT 
    * 
, ROW_NUMBER() OVER(ORDER BY IIF(LocName IS NULL, 0, 1), SomeOtherColumnToSort) AS SortOrder 

FROM 
    Table 
+0

如果您有ISNULL()函數,爲什麼要使用IIF來查看它是否爲空。 – asemprini87

+0

真的,你可以使用'ISNULL()' – mheptinstall

1

Row_Number窗函數順序降序排列LocNameNULL值將在年底進行排序

Select * from 
(
select Row_Number()over(Partition by EntityName Order by LocName desc) Rn, * 
From yourtable 
) A 
Where Rn = 1 

注:如果你有一個以上的NOT NULL LocNameEntityName則將只帶來一條記錄

+0

謝謝,這似乎工作! – jackstraw22

0

您可以將row_number與案例一起使用以創建一個自定義的訂單,其中null爲空呃非空值。我們可以按照升序對locname進行排序,但是它會按特定的順序(這不是問題中指定的)選擇一行。

select * from (
select 
    t.*, 
    row_number() over (partition by entityname 
         order by case when locname is null then 1 else 0 end) rn 
from your_table t 
) t where rn = 1;