Sql 根据时间戳删除重复记录

Sql 根据时间戳删除重复记录,sql,sql-server,Sql,Sql Server,我正在写一个查询以查找重复记录。我有一个包含以下列的表 Id, Deliveries, TankId, Timestamp. 我已经插入了重复的记录,即相同的tankid,相同的交付,带有+1天的偏移时间戳 现在我想删除时间戳较小的重复记录 e、 g.我在7月24日和25日为同一个tankid添加了重复交付。我需要删除第24条记录 我尝试了以下查询 SELECT raw.TimeStamp,raw.[Delivery],raw.[TankId] FROM [dbo].[tObservatio

我正在写一个查询以查找重复记录。我有一个包含以下列的表

Id, Deliveries, TankId, Timestamp.
我已经插入了重复的记录,即相同的tankid,相同的交付,带有+1天的偏移时间戳

现在我想删除时间戳较小的重复记录

e、 g.我在7月24日和25日为同一个tankid添加了重复交付。我需要删除第24条记录

我尝试了以下查询

SELECT raw.TimeStamp,raw.[Delivery],raw.[TankId]
FROM  [dbo].[tObservationData] raw
INNER JOIN (
    SELECT [Delivery],[TankSystemId]
    FROM [dbo].[ObservationData] 
    GROUP BY [Delivery],[TankSystemId]
    HAVING COUNT([ObservationDataId]) > 1
    ) dup 
    ON raw.[Delivery] = dup.[Delivery] AND raw.[TankId] = dup.[TankId]
    AND  raw.TimeStamp >'2019-06-30 00:00:00.0000000' AND raw.[DeliveryL]>0
ORDER BY [TankSystemId],TimeStamp

但是上面也给出了其他记录,我怎样才能找到并删除这些重复记录呢?

你只是在找这个吗

SELECT od.*
FROM (SELECT od.*,
             ROW_NUMBER() OVER (PARTITION BY od.TankId, od.Delivery ORDER BY od.TimeStamp DESC) as seqnum
      FROM [dbo].[tObservationData] od
     ) od
WHERE seqnum = 1;
我认为它会起作用

SELECT raw.TimeStamp,raw.[Delivery],raw.[TankId]
FROM  [dbo].[tObservationData] raw
INNER JOIN (
    SELECT [Delivery],[TankSystemId],min([TimeStamp]) as min_ts
    FROM [dbo].[ObservationData] 
    GROUP BY [Delivery],[TankSystemId]
    HAVING COUNT([ObservationDataId]) > 1
    ) dup 
    ON raw.[Delivery] = dup.[Delivery] AND raw.[TankId] = dup.[TankId] and raw.[TimeStamp] = dup.min_ts
    AND  raw.TimeStamp >'2019-06-30 00:00:00.0000000' AND raw.[DeliveryL]>0
ORDER BY [TankSystemId],TimeStamp

在这种情况下,您可以使用partition by ORDERBY子句。您可以在desc order中按TankID、交货和订单按时间戳进行分区

Select * from (
Select *,ROW_NUMBER() OVER (PARTITION BY TankID,Delievry ORDER BY [Timestamp] DESC) AS rn
from [dbo].[ObservationData]
) 
where rn = 1
在上述代码中,rn=1的记录将具有最新的时间戳。因此,您只能选择这些选项,而忽略其他选项。您还可以使用相同的方法从表中删除记录

WITH TempObservationdata (TankID,Delivery,Timestamp)
AS
(
SELECT TankID,Delivery,ROW_NUMBER() OVER(PARTITION by TankID, Delivery ORDER BY Timsetamp desc) 
AS Timestamp
FROM dbo.ObservationData
)
--Now Delete Duplicate Rows
DELETE FROM TempObservationdata 
WHERE Timestamp > 1


示例数据和期望的结果会有所帮助。只需添加子qery min(时间戳)并将其添加到join@Y.K.您能为我的查询提供添加的更改作为答案吗?那么如何删除其他记录?我以为您只想删除时间最少的行是..但这将列出哪些是重复记录,然后我需要删除它们?我有1000条记录我不太明白这个问题,运行这个脚本你会得到一个日期最小的副本,然后你可以运行
delete
statement抱歉,谢谢你