2014-02-20 3 views
1

#tempTBRB라는 간단한 임시 테이블로 피드하는 복잡한 쿼리가 있습니다.SQL Server - 일치하는 행을 기반으로 행을 필터링하는 방법?

선택 * #tempTBRB ORDER BY 계정 ID는이 결과 집합 산출에서 : 모든 경우에

enter image description here

, 주어진 계정 ID 만 1 행이 행이, 아무 문제가 남아 있습니다. 그러나 2 개 이상의 행이있을 때마다 2의 SDIStatus 행을 유지하고 2의 SDIStatus를 필터링하고 싶습니다.

분명히 "where WHERE SDIStatus = 1 "로 설정하면 AccountID에 대해 하나의 행만있는 유효한 행을 많이 필터링하므로 SDIStatus는 2가됩니다.

동일한 AccountID에 대해 다른 행이있을 때만 SDIStatus가 2 인 모든 행을 필터링합니다. 그리고 동일한 AccountID에 대해 2 개의 행이있을 경우 SDIStatus가 1이고 SDIStatus가 2 인 행이 정확히 1 행이됩니다.

SQL Server 2012를 사용하고 있습니다. 어떻게 처리됩니까?

+0

죄송 합니다만, 나는 며칠 후에 다시 마을을 떠납니다. 나는 절대적으로 이것에 돌아올 것이고 대답, upvote, 등을 고를 것이다. 고마워! – HerrimanCoder

답변

1
SELECT 
    AccountID 
,MIN(SDIStatus) AS MinSDIStatus 
INTO #MinTable 
FROM #tempTBRB 
GROUP BY AccountID 

SELECT * 
FROM #tempTBRB T 
JOIN #MinTable M ON 
    T.AccountID = M.AccountID 
    AND T.SDIStatus = M.MinSDIStatus 

DROP TABLE #MinTable 
+0

아미, 당신은 그것을 못 박았습니다. 고맙다. 그리고 나의 미안함 때문에 유감스럽게 생각하면서, 나는 도시에서 나가야했다. – HerrimanCoder

1

다음은 나를 위해 작동하는 작은 테스트입니다. 당신이 당신의 SELECT 문에서 여분의 열을 추가하는 경우, 모두 잘해야한다 :

CREATE TABLE #Temp (ID int, AccountID int, Balance money, SDIStatus int) 

INSERT INTO #Temp (ID, AccountID, Balance, SDIStatus) VALUES (1, 4100923, -31.41, 2) 
INSERT INTO #Temp (ID, AccountID, Balance, SDIStatus) VALUES (2, 4132170, 0, 2) 
INSERT INTO #Temp (ID, AccountID, Balance, SDIStatus) VALUES (3, 4137728, 193.10, 1) 
INSERT INTO #Temp (ID, AccountID, Balance, SDIStatus) VALUES (4, 4137728, 0, 2) 

SELECT ID, AccountID, Balance, SDIStatus 
FROM 
(
    SELECT ID, AccountID, Balance, SDIStatus, 
     row_number() over (partition by AccountID order by SDIStatus desc) as rn 
    FROM #Temp 
) x 
WHERE x.rn = 1 

DROP TABLE #Temp 

은 다음과냅니다 :

ID AccountID Balance SDIStatus 
1 4100923 -31.41 2 
2 4132170 0.00  2 
4 4137728 0.00  2 
+0

내 문제에 솔루션을 적용하려고 할 때 오류가 발생했습니다. 그러나 시도에 감사드립니다. – HerrimanCoder

+0

좀 더 구체적으로 기재 할 수 있습니까? 그것은 당신의 문제에 대한 일반적인 해결책입니다. –

0

난 당신이 필요한 변경에 따라 만들 비슷한 코드가 필요 추측하여 테이블 구조

declare @tab table (ID INT IDENTITY (1,1),AccountID int,SDISTATUS int) 
insert into @tab values(4137728,1),(4137728,2),(41377,1),(41328,2) 

select * from 
(select *, row_number()OVER(Partition by AccountID Order by SDISTATUS) RN from @tab) T 
where t.RN=1 

또는

WITH CTE AS 
(select *, row_number()OVER(Partition by AccountID Order by SDISTATUS) RN from @tab) 
select * from CTE where t.RN=1 
관련 문제