2012-08-15 3 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과 같이 설정 할 수 있기 때문에

답변

3

: 나는 당신이 그 이름에 대한 가장 높은 ID가 된 이후이뿐만 아니라 반환 다음 원하는 가정

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

을 삭제 된 것으로 표시되지 :

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 |