2014-01-07 161 views
0

以下查询会在第一个分区集之后产生重复的row_numbers。例如,第一组fldPK = 2403和fldCIA = 1,收到以下...ROW_NUMBER()OVER PARTITION返回重复值

2403 1 1 
2403 1 2 
2403 1 3 
2403 1 4 

和第二组中的我接收...

2403 2 1 
2403 2 1 <-- duplicate 1 within the same partition 
2403 2 2 
2403 2 3 

    SELECT *, 1 AS fldBF, 
       ROW_NUMBER() OVER (PARTITION BY fldPK, fldCIA ORDER BY fldPK) AS sCount 
    INTO #tmpTable 
    FROM V_qryCSPGA 
    WHERE fldPK IN(SELECT DISTINCT thePK FROM FN_qryAllDTPK()) 

    UNION ALL 

    SELECT *, 1 AS fldBF, 
       ROW_NUMBER() OVER (PARTITION BY fldPK, fldCIA ORDER BY fldPK) AS sCount 
    FROM FN_qryCSGBA() 
    WHERE fldPK IN(SELECT DISTINCT thePK FROM FN_qryAllDTPK()) 
    ORDER BY fldPK, fldCIA, fldNDat; 

为什么会发生这种情况?对于每一套fldPK和fldCIA的我需要重新启动的行号数为1,更正确的数据会...

2403 3 1 
2403 3 2 
2403 3 3 
2403 3 4 
2403 3 5 
2403 3 6 
2403 3 7 
2403 3 8 
2403 3 9 
+1

你有一个'UNION',这就是为什么。两个单独的计数。 –

+0

有点想通,如果我最初创建一个NULL sCount列,是否有更新?我试过了,但所有的sCount值都是1. – codingManiac

+1

您可以在派生表中使用UNION,然后在外部查询中使用ROW_NUMBER()。这会给现在得到重复的行赋予不同的数字(如果这就是你所需要的)。 –

回答

3

这将停止重复的号码。新的编号是否会被你的真实意图,是另一件事:

; WITH cte AS 
    (SELECT *, 1 AS fldBF 
    FROM V_qryCSPGA 
    WHERE fldPK IN(SELECT DISTINCT thePK FROM FN_qryAllDTPK()) 

    UNION ALL 

    SELECT *, 1 AS fldBF 
    FROM FN_qryCSGBA() 
    WHERE fldPK IN(SELECT DISTINCT thePK FROM FN_qryAllDTPK()) 
) 
SELECT *, 
     ROW_NUMBER() OVER (PARTITION BY fldPK, fldCIA ORDER BY fldPK) AS sCount 
INTO #tmpTable 
FROM cte 
ORDER BY fldPK, fldCIA, fldNDat; 
+0

完美地工作,谢谢! – codingManiac

相关问题