SQL Query以排除重复项

时间:2018-04-03 05:55:34

标签: sql sql-server tsql

我在为工作场所编写代码时遇到问题,以消除查询中出现的重复记录。

当前查询输出:

ID
Name
RelationID
RelationName
RelationDescription
Year
ModifiedDate
ModifiedBy

我遇到的问题是ModifiedDate(datetime)列有时会在同一天进行多次修改,因此在执行查询时会显示重复记录。

我已尝试使用SELECT DISTINCT, GROUP BY, WHERE语句过滤年份等ModifiedDate = convert(varchar(10), ModifiedDate, 102)以将modifiedDate和time分解为单独的列(由于某些修改已在同一天进行了类似修改,因此无法对其进行过滤并尝试过不同的方法尝试过滤列RelationID,因此它只显示一条记录,但没有一条记录有效。

我想知道是否有人可以帮助我过滤列RelationID以仅显示最新修改后的内容?我已经在互联网上搜寻了几天,但我无法让它上​​班。

查询目前看起来像这样:

我的原始查询:

SELECT DISTINCT
    ID, Name, RelationID, RelationName, RelationDescription, Year, ModifiedDate, ModifiedBy
FROM table1, table2
WHERE Year = YEAR(GETDATE()) AND ModifiedDate IS NOT NULL

输出:

123, Dave, 321, Sarah, 2018, 2015-12-01 09:47:36.347
123, Dave, 321, Sarah, 2018, 2015-12-01 09:47:36.347

表1和表2由RelationID内部连接。 ModifiedDate和ModifiedBy在表1中。

感谢您的耐心等待 - 如果您需要更多信息,请与我们联系。

4 个答案:

答案 0 :(得分:0)

尝试使用CTE

WITH TEMP AS
(
  SELECT RELATIONID,MAX(MODIFIEDDATE) MDATE FROM TABLENAME
   GROUP BY RELATIONID
)
SELECT A.* FROM TEMP T
INNER JOIN TABLENAME A
ON A.RELATIONID=T.RELATIONID AND A.MODIFIEDDATE=T.MDATE

答案 1 :(得分:0)

下面的查询仅显示每个RelationID的最新修改。 OUTER APPLY基本上是一个OUTER JOIN,您可以应用其他过滤器,例如在这种情况下TOP 1只能获得最后修改的记录。

SELECT
    [ID]
    ,[Name]
    ,[RelationID]
    ,[RelationName]
    ,[RelationDescription]
    ,[Year]
    ,[ModifiedDate]
    ,[ModifiedBy]
FROM
    [table2]
OUTER APPLY (
    SELECT
        TOP 1
        [ModifiedDate]
        ,[ModifiedBy]
    FROM
        [table1]
    WHERE
        [table2].[RelationID] = [table1].[RelationID]
    ORDER BY
        [ModifiedDate] DESC
) [table1]

答案 2 :(得分:0)

You can use CTE and Row Number and filter the data by the highest modified time
See the below query

;with CTE 
AS
(SELECT ID, Name, RelationID, RelationName, RelationDescription, [Year], ModifiedDate, ModifiedBy
        ,ROW_NUMBER() OVER (Partition by RelationID ORDER BY ModifiedDate DESC) RN
FROM Table1
INNER JOIN Table2 ON Table1.RelationID = Table2.RelationID
)
Select * from CTE
where RN = 1

答案 3 :(得分:-1)

你可以试试这种结构:

SELECT ID, Name, RelationID, RelationName, RelationDescription, Year, ModifiedDate, ModifiedBy
FROM Table1
INNER JOIN Table2 ON Table1.RelationID = Table2.RelationID
WHERE ModifiedDate = (
    SELECT MAX(ModifiedDate) FROM Table1 AS TableX 
    WHERE Table1.ID = TableX.ID -- and other columns as necessary
 )