删除SQL结果副本中设置一个表(Remove duplicates in SQL Result se

2019-10-18 22:24发布

下午/晚上所有,

我在寻找的最后润色到下面的查询。 我需要删除列的重复出现在特定行。 目前使用下面的SQL:

SELECT CBNEW.*
FROM CallbackNewID CBNEW 
INNER JOIN (SELECT IDNEW, MAX(CallbackDate) AS MaxDate 
FROM CallbackNewID 
GROUP BY IDNEW) AS groupedCBNEW 
ON (CBNEW.CallbackDate = groupedCBNEW.MaxDate) AND (CBNEW.IDNEW = groupedCBNEW.IDNEW);

我的结果集看起来像下面

ID     RecID  Comp  Rem Date_               IDNEW   IDOLD   CB? CallbackDate
138618  83209   1   0   2012-03-16 12:40:00 83209   83209   2   16-Mar-12
138619  83209   1   0   2012-03-16 12:40:00 83209   83209   2   16-Mar-12
110470  83799   1   0   2011-07-27 11:46:00 83799   83799   10  27-Jul-11
110471  83799   1   0   2011-07-27 11:46:00 83799   83799   10  27-Jul-11

然而,这让我重复在CallBackDate和IDNEW列值,因为在表中存在具有相同IDNEW和CallbackDate值一些不同的主键。

如果我倾倒这个结果到Excel中,我可以只使用去除第一ID列重复,问题解决了真实。

但我想要做的就是确保我的结果只包括ID列,其中IDNEW和CallbackDate被复制的第一个实例。

我敢肯定,我只需将一小片SQL的,但我坚持,如果我能找到答案为止。

非常感激你的帮助。

Answer 1:

尝试添加MIN(ID)到内部查询,然后将它添加也对ON子句:

SELECT CBNEW.*
FROM CallbackNewID CBNEW 
INNER JOIN (SELECT IDNEW, MIN(ID) AS MinId, MAX(CallbackDate) AS MaxDate 
FROM CallbackNewID 
GROUP BY IDNEW) AS groupedCBNEW 
ON (CBNEW.CallbackDate = groupedCBNEW.MaxDate) 
   AND (CBNEW.IDNEW = groupedCBNEW.IDNEW)
   AND (CBNEW.ID = groupedCBNEW.MinId) ;

sqlfiddle演示



Answer 2:

这是一个相当“蛮力”的方法。 它只是需要你的原始查询的结果,并不会Min()在[ID], Max()在[比较]和[REM],以及GROUP BY于一切:

SELECT 
    Min(t.ID) AS MinOfID, 
    t.RecID, 
    Max(t.Comp) AS MaxOfComp, 
    Max(t.Rem) AS MaxOfRem, 
    t.Date_, 
    t.IDNEW, 
    t.IDOLD, 
    t.[CB?], 
    t.CallbackDate
FROM 
    (
        SELECT CBNEW.*
        FROM 
            CallbackNewID CBNEW 
            INNER JOIN 
            (
                SELECT IDNEW, MAX(CallbackDate) AS MaxDate 
                FROM CallbackNewID 
                GROUP BY IDNEW
            ) AS groupedCBNEW 
                ON (CBNEW.CallbackDate = groupedCBNEW.MaxDate) 
                AND (CBNEW.IDNEW = groupedCBNEW.IDNEW)
    ) t
GROUP BY 
    t.RecID, 
    t.Date_, 
    t.IDNEW, 
    t.IDOLD, 
    t.[CB?], 
    t.CallbackDate;

它可能不是非常优雅,但如果工程....



Answer 3:

在MS SQL Server中,我认为你正在寻找的ROW_NUMBER()函数。

像这样的东西应该帮助你得到你在找什么:

SELECT
    X.*
FROM
    (
        SELECT
            *,
            ROW_NUMBER() OVER (PARTITION BY DBNEW.IDNEW, DBNEW.MaxDate) [row_num]
        FROM
            CallbackNewID CBNEW 
            INNER JOIN 
            (
                SELECT
                    IDNEW,
                    MAX(CallbackDate) AS MaxDate
                FROM
                    CallbackNewID 
                GROUP BY
                    IDNEW
            ) AS groupedCBNEW ON (CBNEW.CallbackDate = groupedCBNEW.MaxDate) AND (CBNEW.IDNEW = groupedCBNEW.IDNEW)
    ) X
WHERE
    X.row_num = 1


Answer 4:

SELECT
    A.*
FROM
    (SELECT
            *,
            ROW_NUMBER() OVER (PARTITION BY IDNEW ORDER BY CallbackDate DESC)
                          AS [row_num]
     FROM CallbackNewID 
    ) A
WHERE
    A.row_num = 1


文章来源: Remove duplicates in SQL Result set of ONE table