SQL Server - 如何根据匹配的行过滤行?

时间:2014-02-20 18:25:06

标签: sql sql-server tsql sql-server-2012

我有一个复杂的查询,它被提供给一个名为#tempTBRB的简单临时表。

select * from #tempTBRB ORDER BY AccountID产生此结果集:

enter image description here

在所有情况下,当给定的AccountID只有一行时,该行应该保留,没问题。但是每当有2行(永远不会超过2行)时,我想保持SDIStatus为1的行,并过滤出2的SDIStatus。

显然,如果我使用像“WHERE SDIStatus = 1”这样的简单where子句,那就不行了,因为它会过滤掉很多有效行,其中AccountID只有1行,而SDIStatus是2。

另一种说法是,我想过滤掉SDIStatus为2的所有行,只有当同一个AccountID有另一行时。当同一个AccountID有2行时,SDIStatus为1行时只有1行,SDIStatus为2行。

我正在使用SQL Server 2012.它是如何完成的?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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