我需要通過符合條件的行執行一個組,否則返回所有不滿足條件的行。例如,在下表中,我想只對「active」字段中具有'1'的行進行分組,並返回所有沒有的行。按值刪除重複的行
表(ID,標籤,有源):
1, A, 1
2, A, 1
3, B, 0
4, B, 0
將返回:
1, A, 1
3, B, 0
4, B, 0
我需要通過符合條件的行執行一個組,否則返回所有不滿足條件的行。例如,在下表中,我想只對「active」字段中具有'1'的行進行分組,並返回所有沒有的行。按值刪除重複的行
表(ID,標籤,有源):
1, A, 1
2, A, 1
3, B, 0
4, B, 0
將返回:
1, A, 1
3, B, 0
4, B, 0
這是我能想到的最簡單的方法。這是小組的一個案例陳述。如果條件滿足,則按標籤分組,否則按主鍵分組。
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
編輯:我誤解你想在組的字段。現在更正。
當我的答案如此簡單時,我喜歡它我很尷尬我沒有想到它。 – scader 2010-01-30 15:44:35
你可以使用一個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服務器,所以這是完全未經測試的。
因此... 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
是新的資源密集型? – scader 2010-01-30 14:11:14
我更喜歡我的方法,因爲沒有子查詢並重新調整id字段,因爲case語句中的唯一選項減少了幾個函數調用。 但是,如果與這一個去,我認爲你必須從GROUP BY子句中刪除id列。否則,它將返回沒有分組的所有行。 – 2010-01-30 14:24:00
也許查詢的佈局可能是這樣的:
這是一個很模糊的問題。等待重要大小的更新。 – 2010-01-30 13:53:29
其中是example .. – Amirshk 2010-01-30 13:54:50