2012-08-15 66 views
0

我有简单的SQL Server查询:SQL Server查询采取最后的分组行的条件

declare @table table (id int, name nvarchar(5), deleted bit) 

insert into @table(id, name, deleted) values(1, 'A1', 0) 
insert into @table(id, name, deleted) values(2, 'A1', 0) 
insert into @table(id, name, deleted) values(3, 'A1', 0) 
insert into @table(id, name, deleted) values(4, 'A1', 1) 
insert into @table(id, name, deleted) values(5, 'A2', 0) 
insert into @table(id, name, deleted) values(6, 'A2', 0) 

select 
    max(id) as id, 
    name 
from @table 
where deleted = 0 
group by name 

它返回到行

id |name 
-------------- 
3 |A1 
6 |A2 

但应该只返回一个

id |name 
-------------- 
6 |A2 

因为A1的最后(或最大)ID被删除。

如何解决我的查询。

非常感谢。

回答

3

既然你可以有一个第三套是这样的:

insert into @table(id, name, deleted) values(7, 'A3', 1) 
insert into @table(id, name, deleted) values(8, 'A3', 0) 

我想,你希望下面返回为好,因为该名称最高ID是标记为删除:

id name 
---- ---- 
8  A3 

然后此查询应该这样做:

;WITH x AS 
(
    SELECT id, name, deleted, 
    rn = ROW_NUMBER() OVER (PARTITION BY name ORDER BY id DESC) 
    FROM @table 
) 
SELECT id = MAX(id), name 
FROM x 
WHERE NOT EXISTS 
(
    SELECT 1 FROM x AS x2 
    WHERE name = x.name 
    AND deleted = 1 AND rn = 1 
) 
GROUP BY name; 

名如果你只想要返回的行其中没有行特定的名字被彻底删除,那么它的稍微简单:

SELECT id = MAX(id), name 
FROM @table AS t 
WHERE NOT EXISTS 
(
    SELECT 1 FROM @table 
    WHERE name = t.name AND deleted = 1 
) 
GROUP BY name; 
1

另一种方法:http://www.sqlfiddle.com/#!3/697d7/5

create table t(id int, name nvarchar(5), deleted bit) 

insert into t(id, name, deleted) values(1, 'A1', 0) 
insert into t(id, name, deleted) values(2, 'A1', 0) 
insert into t(id, name, deleted) values(3, 'A1', 0) 
insert into t(id, name, deleted) values(4, 'A1', 1) 
insert into t(id, name, deleted) values(5, 'A2', 0) 
insert into t(id, name, deleted) values(6, 'A2', 0) 


with no_deletions as 
(
    select name 
    from t 
    group by name 
    having max(nullif(cast(deleted as int),0)) is null 
) 
select  
    max(id) as id, 
    name  
from t 
where name in (select name from no_deletions) 
group by name 

输出:

| ID | NAME | 
------------- 
| 6 | A2 |