我有一个复杂的查询,它被提供给一个名为#tempTBRB的简单临时表。
select * from #tempTBRB ORDER BY AccountID产生此结果集:
在所有情况下,当给定的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.它是如何完成的?
答案 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