2010-01-30 67 views
2

我需要通過符合條件的行執行一個組,否則返回所有不滿足條件的行。例如,在下表中,我想只對「active」字段中具有'1'的行進行分組,並返回所有沒有的行。按值刪除重複的行

表(ID,標籤,有源):

1, A, 1 
2, A, 1 
3, B, 0 
4, B, 0 

將返回:

1, A, 1 
3, B, 0 
4, B, 0 
+0

這是一個很模糊的問題。等待重要大小的更新。 – 2010-01-30 13:53:29

+0

其中是example .. – Amirshk 2010-01-30 13:54:50

回答

3

這是我能想到的最簡單的方法。這是小組的一個案例陳述。如果條件滿足,則按標籤分組,否則按主鍵分組。

SELECT id, label, active 
FROM table 
GROUP BY 
    CASE 
    WHEN active = 1 THEN active 
    ELSE id END 

如果你想通過組積極標籤:

SELECT id, label, active 
FROM table 
GROUP BY 
    CASE 
    WHEN active = 1 THEN active 
    ELSE id END, 
    label 

編輯:我誤解你想在組的字段。現在更正。

+0

當我的答案如此簡單時,我喜歡它我很尷尬我沒有想到它。 – scader 2010-01-30 15:44:35

0

你可以使用一個CASE語句

select min(id) as id, label, active 
from (
    select id, label, active, 
      case 
      when active = 1 then 'active' 
      else convert(varchar,newid()) as discriminator 
      end 
    from table) t 
group by label, active, discriminator 

這會給一個共同的價值滿足條件的所有行(active = 1)以及所有其他行的唯一值,以便它們保持未分組狀態。

我目前沒有訪問SQL服務器,所以這是完全未經測試的。

+0

因此... SELECT id,label,active,case when active = 1 then null else convert(varchar,newid())end by groupit groupit 不幸的是,我將使用還會返回許多其他字段上的聚合函數,但我想我可以將原始數據首先分組爲子選擇,然後加入其他數據。 – scader 2010-01-30 14:06:06

+0

是新的資源密集型? – scader 2010-01-30 14:11:14

+0

我更喜歡我的方法,因爲沒有子查詢並重新調整id字段,因爲case語句中的唯一選項減少了幾個函數調用。 但是,如果與這一個去,我認爲你必須從GROUP BY子句中刪除id列。否則,它將返回沒有分組的所有行。 – 2010-01-30 14:24:00

0

也許查詢的佈局可能是這樣的: