2017-06-22 22 views
2

我主要是新的SQL,所以我不知道了很多關於它提供的所有高級選項。我目前正在使用MS SQL Server 2016(開發版)。SQL:刪除重複的基礎上性判據

我有以下結果:

| Type | Role |     GUID     | 
|--------|--------|--------------------------------------| 
| B | 0 |     ABC     | 
| B | 0 |     KLM     | 
| A | 0 |     CDE     | 
| A | 0 |     EFG     | 
| A | 1 |     CDE     | 
| B | 1 |     ABC     | 
| B | 1 |     GHI     | 
| B | 1 |     IJK     | 
| B | 1 |     KLM     | 

選擇以下選項:

SELECT DISTINCT 
     Type, 
     Role, 
     GUID 

我期待算GUID以下約束:

- >如果有多個行具有相同的GUID,只能用一個「角色」設置爲0
計數用「角色」的行設定爲「1」,否則,計算所述一個 - 如果第>根據他們自己的角色價值,它只是一個,將它算作「角色0」或「角色1」。

我的目標是得到以下結果:

| Type | Role |    COUNT(GUID)    | 
|--------|--------|--------------------------------------| 
| A | 0 |     1     | => counted EFG as there was no other row with a "Role" set to 1 
| A | 1 |     1     | => counted CDE with "Role" set to 1, but the row with "Role" set to 0 is ignored 
| B | 1 |     4     | 
+0

1.你跟工作有什麼版本的SQL Server? 2.到目前爲止您嘗試過什麼? 3.如果有多行具有相同的「guid」,但沒有一個角色設置爲1,您應該怎麼做? –

+0

1.我使用SQL服務器2016 2.我試圖使用用「不同的」 3.我已經使用在第一次請求「不同的」(「SELECT DISTINCT類型,角色,GUID」),從而這種情況下不應該發生。 – Dremor

回答

1

一個NOT EXISTS可以用於此。

例如:

declare @T table ([Type] char(1), [Role] int, [GUID] varchar(3)); 

insert into @T ([Type], [Role], [GUID]) values 
('A',0,'CDE'), 
('A',0,'EFG'), 
('A',1,'CDE'), 
('B',0,'ABC'), 
('B',0,'KLM'), 
('B',1,'ABC'), 
('B',1,'GHI'), 
('B',1,'IJK'), 
('B',1,'KLM'); 

select [Type], [Role], COUNT(DISTINCT [GUID]) as TotalUniqueGuid 
from @T t 
where not exists (
    select 1 
    from @T t1 
    where t.[Type] = t1.[Type] 
    and t.[Role] = 0 and t1.[Role] > 0 
    and t.[GUID] = t1.[GUID] 
) 
group by [Type], [Role]; 

返回:

Type Role TotalUniqueGuid 
A 0 1 
A 1 1 
B 1 4 
3

您的查詢不實現你所提到的邏輯。下面是一個使用子查詢和窗口功能的方法:

select type, role, count(*) 
from (select t.*, 
      count(*) over (partition by GUID) as guid_cnt 
     from t 
    ) t 
where (guid_cnt > 1 and role = 1) or 
     (guid_cnt = 1 and role = 0) 
group by type, role; 

提交查詢匹配GUID該行數。外部where然後根據您的條件使用它進行過濾。

注:role不是列名的好選擇。它是一個關鍵字(請參見here),並可能在將來保留(請參閱here)。

+0

這似乎只給了我2次「B型,角色1」,其中應該有4次發生。 而對於列名,他們是匿名的名字,我用一個前綴(類似「1234_」),因此,沒有衝突的風險。 – Dremor

+0

@Dremor。 。 。根據你的規則,它應該有「ABC」和「KLM」,因爲它們出現兩次。 「GHI」和「IJK」只出現一次,所以角色「1」不計算在內。如果你有一套不同的規則,*不要*改變問題;問問別人。改變問題會使試圖幫助你的人的答案失效。這可以畫下來。 –

+0

事實上,我的規則是錯誤的,即使只有一行「Role = 1」,我也想計算行數。另一方面,我在我的問題上提供了預期的結果,如果您發現它與規則不一致,那麼您至少可以要求精確度。 在編輯方面,沒有什麼能夠阻止那些回答編輯他們問題的人,當然提供問題的人花時間通過評論(比如這個)來通知他們。 – Dremor